From bef4f1daf55c6c6eebcc750a7beecca47da6def5 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 8 Nov 2018 16:09:59 +0800 Subject: [PATCH 001/115] auto ml framework --- .../com/tencent/angel/ml/auto/Example.scala | 55 ++++++++ .../ml/auto/acquisition/Acquisition.scala | 37 ++++++ .../angel/ml/auto/acquisition/EI.scala | 59 +++++++++ .../acquisition/optimizer/AcqOptimizer.scala | 40 ++++++ .../acquisition/optimizer/LocalSearch.scala | 46 +++++++ .../acquisition/optimizer/RandomSearch.scala | 54 ++++++++ .../angel/ml/auto/config/Configuration.scala | 42 ++++++ .../ml/auto/config/ConfigurationSpace.scala | 86 +++++++++++++ .../ml/auto/parameter/ContinuousSpace.scala | 82 ++++++++++++ .../ml/auto/parameter/DiscreteSpace.scala | 56 ++++++++ .../angel/ml/auto/parameter/ParamSpace.scala | 33 +++++ .../angel/ml/auto/setting/Setting.scala | 42 ++++++ .../tencent/angel/ml/auto/solver/Solver.scala | 58 +++++++++ .../ml/auto/solver/SolverWithTrail.scala | 45 +++++++ .../angel/ml/auto/surrogate/RFSurrogate.scala | 83 ++++++++++++ .../angel/ml/auto/surrogate/Surrogate.scala | 120 ++++++++++++++++++ .../angel/ml/auto/trail/TestRunner.scala | 29 +++++ .../angel/ml/auto/trail/TestTrail.scala | 29 +++++ .../tencent/angel/ml/auto/trail/Trail.scala | 29 +++++ .../angel/ml/auto/trail/TrailRunner.scala | 32 +++++ .../angel/ml/auto/utils/DataUtils.scala | 46 +++++++ .../angel/ml/auto/utils/Distribution.scala | 30 +++++ angel-ps/pom.xml | 16 ++- 23 files changed, 1148 insertions(+), 1 deletion(-) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala new file mode 100644 index 000000000..b734fc3b5 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala @@ -0,0 +1,55 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto + +import com.tencent.angel.ml.auto.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.ml.auto.acquisition.{Acquisition, EI} +import com.tencent.angel.ml.auto.config.ConfigurationSpace +import com.tencent.angel.ml.auto.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.ml.auto.setting.Setting +import com.tencent.angel.ml.auto.solver.{Solver, SolverWithTrail} +import com.tencent.angel.ml.auto.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.ml.auto.trail.{TestTrail, Trail} +import com.tencent.angel.ml.math2.vector.IntFloatVector + +object Example extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Float] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Float] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Float] = new DiscreteSpace[Float]("param3", List(0.0f, 1.0f, 3.0f, 5.0f)) + val param4: ParamSpace[Float] = new DiscreteSpace[Float]("param4", List(-5.0f, -3.0f, 0.0f, 3.0f, 5.0f)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + Setting.setBatchSize(1) + Setting.setSampleSize(100) + val sur: Surrogate = new RFSurrogate(cs.paramNum, true) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + val solver: Solver = new Solver(cs, sur, acq, opt) + val trail: Trail = new TestTrail() + val runner: SolverWithTrail = new SolverWithTrail(solver, trail) + val result: (IntFloatVector, Float) = runner.run(100) + sur.stop() + println(s"Best configuration ${result._1.getStorage.getValues.mkString(",")}, best performance: ${result._2}") + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala new file mode 100644 index 000000000..b6ab6e23b --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala @@ -0,0 +1,37 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.acquisition + +import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.ml.math2.vector.IntFloatVector + +/** + * Abstract base class for acquisition function + */ +abstract class Acquisition(val surrogate: Surrogate) { + + /** + * Computes the acquisition value for a given point X + * + * @param X : (1, D), the input points where the acquisition function should be evaluated. + * @return (1, 1) Expected Improvement of X, (1, D) Derivative of Expected Improvement at X + */ + def compute(X: IntFloatVector, derivative: Boolean = false): (Float, IntFloatVector) + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala new file mode 100644 index 000000000..ddfd4516d --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala @@ -0,0 +1,59 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.acquisition + +import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.commons.math3.distribution.NormalDistribution + +/** + * Expected improvement. + * @param surrogate + * @param par : Controls the balance between exploration and exploitation of the acquisition function, default=0.0 + * + */ +class EI(override val surrogate: Surrogate, val par: Float) extends Acquisition(surrogate) { + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + override def compute(X: IntFloatVector, derivative: Boolean = false): (Float, IntFloatVector) = { + val pred = surrogate.predict(X) // (mean, variance) + + // Use the best seen observation as incumbent + val eta: Float = surrogate.curBest._2 + //println(s"best seen result: $eta") + + val s: Float = Math.sqrt(pred._2).toFloat + + if (s == 0) { + // if std is zero, we have observed x on all instances + // using a RF, std should be never exactly 0.0 + (0.0f, new IntFloatVector(X.dim().toInt, new IntFloatDenseVectorStorage())) + } else { + val z = (eta - pred._1 - par) / s + val norm: NormalDistribution = new NormalDistribution + val cdf: Double = norm.cumulativeProbability(z) + val pdf: Double = norm.density(z) + val f = s * (z * cdf + pdf) + println(s"cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf, f: $f") + (f.toFloat, new IntFloatVector(X.dim().toInt, new IntFloatDenseVectorStorage())) + } + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala new file mode 100644 index 000000000..5d0f88fb6 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala @@ -0,0 +1,40 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.acquisition.optimizer + +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration,ConfigurationSpace} + +/** + * Abstract base class for acquisition maximization. + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + */ +abstract class AcqOptimizer(val acqFunc: Acquisition, val configSpace: ConfigurationSpace) { + + /** + * Maximizes the given acquisition function. + * + * @param numPoints : Number of queried points. + * @return A set of tuple(acquisition value, Configuration). + */ + def maximize(numPoints: Int, sorted: Boolean = true): List[(Float, Configuration)] + + def maximize: (Float, Configuration) +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala new file mode 100644 index 000000000..ef9349944 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala @@ -0,0 +1,46 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.acquisition.optimizer + +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} + +/** + * Implementation of local search. + * + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + * @param epsilon : In order to perform a local move one of the incumbent's neighbors needs at least an improvement higher than epsilon + * @param numIters : Maximum number of iterations that the local search will perform + */ +class LocalSearch(override val acqFunc: Acquisition, override val configSpace: ConfigurationSpace, + epsilon: String, numIters: Int) + extends AcqOptimizer(acqFunc, configSpace) { + + /** + * Starts a local search from the given start point and quits if either the max number of steps is reached or + * no neighbor with an higher improvement was found + * + * @param numPoints : Number of queried points. + * @return A set of tuple(acquisition_value, Configuration). + */ + override def maximize(numPoints: Int, sorted: Boolean = true): List[(Float, Configuration)] = ??? + + override def maximize: (Float, Configuration) = ??? +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala new file mode 100644 index 000000000..e5bcc2571 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala @@ -0,0 +1,54 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.acquisition.optimizer + +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.ml.auto.setting.Setting +import org.apache.commons.logging.{Log, LogFactory} + +import scala.util.Random + +/** + * Get candidate solutions via random sampling of configurations. + * + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + * @param seed + */ +class RandomSearch(override val acqFunc: Acquisition, override val configSpace: ConfigurationSpace, + seed: Int = 100) extends AcqOptimizer(acqFunc, configSpace) { + val LOG: Log = LogFactory.getLog(classOf[RandomSearch]) + + val rd = new Random(seed) + + override def maximize(numPoints: Int, sorted: Boolean = true): List[(Float, Configuration)] = { + //println(s"maximize RandomSearch") + val configs: List[Configuration] = configSpace.sampleConfig(Setting.sampleSize) + configs.foreach( config => println(s"sample a configuration: ${config.getVector.getStorage.getValues.mkString(",")}")) + if (sorted) + configs.map{config => (acqFunc.compute(config.getVector)._1, config)}.sortWith(_._1 > _._1).take(numPoints) + else + rd.shuffle(configs.map{config => (0.0f, config)}).take(numPoints) + } + + override def maximize: (Float, Configuration) = { + maximize(1, true).head + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala new file mode 100644 index 000000000..29425d613 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.config + +import com.tencent.angel.ml.math2.vector.IntFloatVector + +/** + * A single configuration + * + * @param configSpace : The configuration space for this configuration + * @param vector : A vector for efficient representation of configuration. + */ +class Configuration(configSpace: ConfigurationSpace, vector: IntFloatVector) { + + def getVector: IntFloatVector = vector + + def getValues: List[Float] = vector.getStorage.getValues.toList + + def keys: List[String] = configSpace.param2Idx.keys.toList + + def get(name: String): Float = get(configSpace.param2Idx.getOrElse(name, -1)) + + def get(idx: Int): Float = vector.get(idx) + + def contains(name: String): Boolean = configSpace.param2Idx.contains(name) +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala new file mode 100644 index 000000000..862a37b57 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala @@ -0,0 +1,86 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.config + +import com.tencent.angel.ml.auto.parameter.ParamSpace +import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.commons.logging.{Log, LogFactory} + +import scala.collection.mutable.ListBuffer + +class ConfigurationSpace(val name: String, var paramDict: Map[String, ParamSpace[Float]] = Map()) { + val LOG: Log = LogFactory.getLog(classOf[ConfigurationSpace]) + + var paramNum: Int = paramDict.size + var param2Idx: Map[String, Int] = paramDict.keys.zipWithIndex.toMap + var idx2Param: Map[Int, String] = param2Idx.map(_.swap) + + def getParamNum: Int = paramNum + + def addParams(params: List[ParamSpace[Float]]): Unit = { + params.foreach(addParam) + } + + def addParam(param: ParamSpace[Float]): Unit = { + if (!paramDict.contains(param.name)) { + paramDict += (param.name -> param) + param2Idx += (param.name -> paramNum) + idx2Param += (paramNum -> param.name) + paramNum += 1 + } + println(s"add param ${param.toString}, current params: ${paramDict.keySet.mkString(",")}") + } + + def getParams: List[ParamSpace[Float]] = paramDict.values.toList + + def getParamByName(name: String): Option[ParamSpace[Float]] = paramDict.get(name) + + def getIdxByParam(name: String): Option[Int] = param2Idx.get(name) + + def getParamByIdx(idx: Int): Option[ParamSpace[Float]] = paramDict.get(idx2Param.getOrElse(idx, "none")) + + // TODO: Store historical configurations to avoid redundancy. + def sampleConfig(size: Int): List[Configuration] = { + var configs: ListBuffer[Configuration] = new ListBuffer[Configuration] + + var missing: Int = 0 + do { + missing = size - configs.length + val vectors: List[IntFloatVector] = List.fill(missing)(new IntFloatVector(paramNum, new IntFloatDenseVectorStorage(paramNum))) + param2Idx.foreach { case (paramName, paramIdx) => + paramDict.get(paramName) match { + case Some(param) => + param.sample(missing).zipWithIndex.foreach { case (f,i) => + vectors(i).set(paramIdx, f) + } + case None => LOG.info(s"Cannot find $paramName.") + } + } + vectors.filter(validConfig).foreach{ vec => + configs += new Configuration(this, vec) + } + } while(configs.length < size) + + configs.toList + } + + // TODO: Implement this func + def validConfig(vec: IntFloatVector): Boolean = true +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala new file mode 100644 index 000000000..56bfe0320 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala @@ -0,0 +1,82 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.parameter + +import com.tencent.angel.ml.auto.utils.Distribution +import org.apache.commons.logging.{Log, LogFactory} + +import scala.collection.mutable.ListBuffer +import scala.util.Random + +/** + * + * @param name: Name of the parameter + * @param lower: Start of the continuous space included. + * @param upper: End of the continuous space included. + * @param num: Sampling count if possible. + * @param seed + */ +class ContinuousSpace(override val name: String, lower: Float, upper: Float, num: Int, + distribution: Distribution.Value = Distribution.LINEAR, seed: Int = 100) extends ParamSpace[Float](name) { + + val rd = new Random(seed) + val values: List[Float] = calValues + + def calValues(): List[Float] = { + var ret: ListBuffer[Float] = ListBuffer[Float]() + distribution match { + case Distribution.LINEAR => + val interval: Float = (upper - lower) / (num - 1) + (0 until num).foreach { i => + ret += lower + i * interval + } + case _ => println(s"Distribution $distribution not supported") + } + + ret.toList + } + + def getLower: Float = lower + + def getUpper: Float = upper + + def getValues: List[Float] = values + + def numValues: Int = num + + def toGridSearch: ParamSpace[Float] = this + + def toRandomSpace: ParamSpace[Float] = this + + override def sample(size: Int): List[Float] = List.fill(size)(sample) + + override def sample: Float = values(rd.nextInt(numValues)) + + override def toString: String = s"ContinuousSpace[$name]: (${values mkString(",")})" + +} + +object ContinuousSpace { + + def main(args: Array[String]): Unit = { + val obj = new ContinuousSpace("test", 0, 10, 5) + println(obj.toString) + println(obj.sample(2).toString()) + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala new file mode 100644 index 000000000..9f5bea824 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala @@ -0,0 +1,56 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.parameter + +import scala.util.Random + +/** + * Search space with discrete values + * + * @param name: Name of the parameter + * @param values: List of all possible values + */ +class DiscreteSpace[T: Numeric](override val name: String, values: List[T], seed: Int = 100) + extends ParamSpace[T](name) { + + val rd = new Random(seed) + + def getValues: List[T] = values + + def numValues: Int = values.length + + def toGridSearch: ParamSpace[T] = this + + def toRandomSpace: ParamSpace[T] = this + + override def sample(size: Int): List[T] = List.fill(size)(sample) + + override def sample: T = values(rd.nextInt(numValues)) + + override def toString: String = s"DiscreteSpace[$name]: (${values mkString(",")})" +} + +object DiscreteSpace { + + def main(args: Array[String]): Unit = { + val obj = new DiscreteSpace[Float]("test", List(1.0f, 2.0f, 3.0f, 4.0f, 5.0f)) + println(obj.toString) + println(obj.sample(2).toString()) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala new file mode 100644 index 000000000..cd7184ec9 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala @@ -0,0 +1,33 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.parameter + + +/** + * Base class of a single parameter's search space. + * + * @param name: Name of the parameter + */ +abstract class ParamSpace[T: Numeric](val name: String) { + + def sample(size: Int): List[T] + + def sample: T + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala new file mode 100644 index 000000000..94f19f5ba --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.setting + +class Setting { +} + +object Setting { + + var batchSize: Int = 1 + var sampleSize: Int = 10 * batchSize + + var taskName: String = "com.tencent.angel.ml.auto.trail.TestRunner" + + def setBatchSize(num: Int): Unit = { + batchSize = num + } + + def setSampleSize(num: Int): Unit = { + sampleSize = num + } + + def setTaskName(name: String): Unit = { + taskName = name + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala new file mode 100644 index 000000000..30ec39b6a --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala @@ -0,0 +1,58 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.solver + +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.acquisition.optimizer.AcqOptimizer +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.ml.auto.setting.Setting +import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.commons.logging.{Log, LogFactory} + +class Solver(val cs: ConfigurationSpace, val surrogate: Surrogate, val acqFuc: Acquisition, val optimizer: AcqOptimizer) { + + val LOG: Log = LogFactory.getLog(classOf[Solver]) + + def getObservations: (List[IntFloatVector], List[Float]) = (surrogate.curX.toList, surrogate.curY.toList) + + def getSurrogate: Surrogate = surrogate + + /** + * Suggests configurations to evaluate. + */ + def suggest(): List[Configuration] = { + //println(s"suggest configurations") + optimizer.maximize(Setting.batchSize).map(_._2) + } + + /** + * Feed evaluation result to the model + * @param configs: More evaluated configurations + * @param Y: More evaluation result + */ + def feed(configs: List[Configuration], Y: List[Float]): Unit = { + //println(s"feed ${configs.size} configurations") + surrogate.update(configs.map(_.getVector), Y) + } + + def feed(config: Configuration, y: Float): Unit = { + surrogate.update(config.getVector, y) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala new file mode 100644 index 000000000..7dba25cfc --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala @@ -0,0 +1,45 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.solver + +import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.ml.auto.trail.Trail +import com.tencent.angel.ml.math2.vector.IntFloatVector + +class SolverWithTrail(val solver: Solver, val trail: Trail) { + + /** + * The main Bayesian optimization loop + * + * @param numIter : Number of Iterations + * @param X : Initial data points that are already evaluated + * @param Y : Initial function values of the already evaluated points + * @return Incumbent and function value of the incumbent + */ + def run(numIter: Int, X: List[Configuration] = Nil, Y: List[Float] = Nil): (IntFloatVector, Float) = { + if (X != Nil && Y != Nil && X.size == Y.size) solver.feed(X, Y) + (0 until numIter).foreach{ iter => + println(s"------iteration $iter starts------") + val configs: List[Configuration] = solver.suggest + val results: List[Float] = trail.evaluate(configs) + solver.feed(configs, results) + } + solver.surrogate.curBest + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala new file mode 100644 index 000000000..6dcc62eff --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala @@ -0,0 +1,83 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.surrogate +import com.tencent.angel.ml.auto.utils.DataUtils +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.mllib.tree.GradientBoostedTrees +import org.apache.spark.mllib.tree.configuration.BoostingStrategy +import org.apache.spark.mllib.tree.model.GradientBoostedTreesModel +import org.apache.spark.{SparkConf, SparkContext} + +class RFSurrogate(override val numParams: Int, override val minimize: Boolean = true) + extends Surrogate(numParams, minimize) { + override val LOG: Log = LogFactory.getLog(classOf[RFSurrogate]) + + var model: GradientBoostedTreesModel = _ + val numIter: Int = 5 + val maxDepth: Int = 2 + val conf = new SparkConf().setMaster("local").setAppName("RandomForest") + val sc = new SparkContext(conf) + sc.setLogLevel("ERROR") + + override def train(): Unit = { + + val boostingStrategy = BoostingStrategy.defaultParams("Regression") + boostingStrategy.numIterations = numIter + boostingStrategy.treeStrategy.maxDepth = maxDepth + boostingStrategy.treeStrategy.categoricalFeaturesInfo = Map[Int, Int]() + + if (curX.size < Math.pow(2, maxDepth - 1)) + return + + val data = DataUtils.parse(sc, curX.toList, curY.toList) + + model = GradientBoostedTrees.train(data, boostingStrategy) + + } + + /** + * Predict means and variances for a single given X. + * + * @param X + * @return a tuple of (mean, variance) + */ + override def predict(X: IntFloatVector): (Float, Float) = { + + if (curX.size < Math.pow(2, maxDepth - 1)) { + return (0.0f, 0.0f) + } + + val preds: Array[Double] = model.trees.map(_.predict(DataUtils.parse(X))) + + println(s"predict of ${X.getStorage.getValues.mkString(",")}: ${preds.mkString(",")}") + + val mean: Double = preds.sum / preds.length + val variance = preds.map(x => Math.pow(x - mean, 2)).sum / preds.length + + println(s"prediction mean $mean variance $variance") + + (mean.toFloat, variance.toFloat) + } + + override def stop(): Unit = { + sc.stop + } + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala new file mode 100644 index 000000000..f815c886a --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala @@ -0,0 +1,120 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.surrogate + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.commons.logging.{Log, LogFactory} + +import scala.collection.mutable.ListBuffer + +/** + * Abstract base class for surrogate model. + * @param numParams : Number of parameters in a configuration + */ +abstract class Surrogate(val numParams: Int, val minimize: Boolean = true) { + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + // Input data points, (N, D) + var curX: ListBuffer[IntFloatVector] = new ListBuffer[IntFloatVector]() + // Target value, (N, ) + var curY: ListBuffer[Float] = new ListBuffer[Float]() + + /** + * Train the surrogate on curX and curY. + */ + def train(): Unit + + /** + * Train the surrogate on X and Y. + * + * @param X : (N, D), input data points. + * @param Y : (N, 1), the corresponding target values. + */ + def train(X: List[IntFloatVector], Y: List[Float]): Unit = { + curX.clear + curY.clear + curX ++ X + curY ++ Y + train + } + + /** + * Update the surrogate with more X and Y. + * + * @param X + * @param Y + */ + def update(X: List[IntFloatVector], Y: List[Float]): Unit = { + X.zip(Y).foreach( tuple => print(tuple._1, tuple._2) ) + curX ++= X + curY ++= Y + train + } + + def print(X: IntFloatVector, y: Float): Unit = { + println(s"update surrogate with X: ${X.getStorage.getValues.mkString(",")} and Y: $y") + } + + def update(X: IntFloatVector, y: Float): Unit = { + print(X, y) + curX += X + curY += y + train + } + + /** + * Predict means and variances for given X. + * + * @param X + * @return tuples of (mean, variance) + */ + def predict(X: List[IntFloatVector]): List[(Float, Float)] = { + X.map(predict) + } + + /** + * Predict means and variances for a single given X. + * + * @param X + * @return a tuple of (mean, variance) + */ + def predict(X: IntFloatVector): (Float, Float) + + def stop(): Unit + + def curBest: (IntFloatVector, Float) = { + if (minimize) curMin else curMax + } + + def curMin: (IntFloatVector, Float) = { + if (curY.isEmpty) (null, Float.MaxValue) + else { + val minIdx: Int = curY.zipWithIndex.min._2 + (curX(minIdx), curY(minIdx)) + } + } + + def curMax: (IntFloatVector, Float) = { + if (curY.isEmpty) (null, Float.MinValue) + else { + val maxIdx: Int = curY.zipWithIndex.max._2 + (curX(maxIdx), curY(maxIdx)) + } + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala new file mode 100644 index 000000000..2aacf62f1 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala @@ -0,0 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.trail + +import com.tencent.angel.ml.auto.config.Configuration + +class TestRunner(config: Configuration) extends TrailRunner(config) { + + override def call(): Float = { + config.getVector.dot(config.getVector).toFloat + } + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala new file mode 100644 index 000000000..3cdf3701e --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala @@ -0,0 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.trail +import com.tencent.angel.ml.auto.config.Configuration + +class TestTrail extends Trail { + + override def evaluate(config: Configuration): Float = { + val ret = config.getVector.dot(config.getVector).toFloat + println(s"evaluate ${config.getVector.getStorage.getValues.mkString(",")}, result $ret") + ret + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala new file mode 100644 index 000000000..c00f24fc8 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala @@ -0,0 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.trail + +import com.tencent.angel.ml.auto.config.Configuration + +abstract class Trail { + + def evaluate(configs: List[Configuration]): List[Float] = configs.map(evaluate) + + def evaluate(config: Configuration): Float + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala new file mode 100644 index 000000000..4a6deee94 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala @@ -0,0 +1,32 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.trail + +import java.util.concurrent.Callable + +import com.tencent.angel.ml.auto.config.Configuration + +abstract class TrailRunner(var config: Configuration) extends Callable[Float]{ + + override def call(): Float + + def setConf(newConf: Configuration): Unit = { + config = newConf + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala new file mode 100644 index 000000000..9e1255db0 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala @@ -0,0 +1,46 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.utils + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import org.apache.spark.mllib.linalg.{Vector, Vectors} +import org.apache.spark.mllib.regression.LabeledPoint +import org.apache.spark.SparkContext +import org.apache.spark.rdd.RDD + +object DataUtils { + + def parse(sc: SparkContext, X: List[IntFloatVector], y: List[Float]): RDD[LabeledPoint] = { + sc.parallelize(X.zipWithIndex.map(entry => parse(entry._1, y(entry._2)))) + } + + def parse(feature: IntFloatVector, label: Float): LabeledPoint = { + if (feature.isDense) + LabeledPoint(label, Vectors.dense(feature.getStorage.getValues.map(x => x.toDouble))) + else + LabeledPoint(label, Vectors.sparse(feature.getDim, feature.getStorage.getIndices, feature.getStorage.getValues.map(x => x.toDouble))) + } + + def parse(feature: IntFloatVector): Vector = { + if (feature.isDense) + Vectors.dense(feature.getStorage.getValues.map(x => x.toDouble)) + else + Vectors.sparse(feature.numZeros, feature.getStorage.getIndices, feature.getStorage.getValues.map{x => x.toDouble}) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala new file mode 100644 index 000000000..af0f61274 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala @@ -0,0 +1,30 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto.utils + +object Distribution extends Enumeration { + + type Distribution = Value + + val LINEAR = Value("1") + + def checkExists(distribution: String): Boolean = this.values.exists(_.toString == distribution) + + def printAll(): Unit = this.values.foreach(println) +} diff --git a/angel-ps/pom.xml b/angel-ps/pom.xml index b61bae54e..ed91cedb8 100644 --- a/angel-ps/pom.xml +++ b/angel-ps/pom.xml @@ -41,9 +41,22 @@ ${project.parent.basedir} provided + 2.1.0 + + org.apache.spark + spark-core_${scala.binary.version} + ${spark.version} + + + + org.apache.spark + spark-mllib_${scala.binary.version} + ${spark.version} + + com.yahoo.datasketches sketches-core @@ -82,7 +95,8 @@ org.json4s json4s-jackson_2.11 - 3.4.2 + 3.2.11 + org.apache.commons From 1a504c50fc116240724045fecafdced198b5cc48 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 12 Nov 2018 17:16:48 +0800 Subject: [PATCH 002/115] initial work of RF in Angel --- .../com/tencent/angel/ml/tree/RFModel.scala | 5 + .../com/tencent/angel/ml/tree/conf/Algo.scala | 17 ++ .../angel/ml/tree/conf/BoostingStrategy.scala | 87 ++++++ .../tree/conf/EnsembleCombiningStrategy.scala | 10 + .../angel/ml/tree/conf/FeatureType.scala | 9 + .../angel/ml/tree/conf/QuantileStrategy.scala | 9 + .../tencent/angel/ml/tree/conf/Strategy.scala | 138 ++++++++++ .../angel/ml/tree/impurity/Entropy.scala | 138 ++++++++++ .../tencent/angel/ml/tree/impurity/Gini.scala | 135 ++++++++++ .../angel/ml/tree/impurity/Impurities.scala | 16 ++ .../angel/ml/tree/impurity/Impurity.scala | 172 ++++++++++++ .../angel/ml/tree/impurity/Variance.scala | 110 ++++++++ .../angel/ml/tree/loss/AbsoluteError.scala | 29 ++ .../tencent/angel/ml/tree/loss/LogLoss.scala | 45 ++++ .../com/tencent/angel/ml/tree/loss/Loss.scala | 52 ++++ .../tencent/angel/ml/tree/loss/Losses.scala | 12 + .../angel/ml/tree/loss/SquaredError.scala | 29 ++ .../ml/tree/model/DecisionTreeModel.scala | 250 ++++++++++++++++++ .../ml/tree/model/InformationGainStats.scala | 106 ++++++++ .../tencent/angel/ml/tree/model/Node.scala | 225 ++++++++++++++++ .../tencent/angel/ml/tree/model/Predict.scala | 25 ++ .../tencent/angel/ml/tree/model/Split.scala | 49 ++++ .../ml/tree/model/TreeEnsembleModels.scala | 206 +++++++++++++++ 23 files changed, 1874 insertions(+) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Losses.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala new file mode 100644 index 000000000..27547b6c7 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala @@ -0,0 +1,5 @@ +package com.tencent.angel.ml.tree + +object RFModel { + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala new file mode 100644 index 000000000..3e900b2b5 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala @@ -0,0 +1,17 @@ +package com.tencent.angel.ml.tree.conf + +/** + * Enum to select the algorithm for the decision tree + */ +object Algo extends Enumeration { + + type Algo = Value + + val Classification, Regression = Value + + private[mllib] def fromString(name: String): Algo = name match { + case "classification" | "Classification" => Classification + case "regression" | "Regression" => Regression + case _ => throw new IllegalArgumentException(s"Did not recognize Algo name: $name") + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala new file mode 100644 index 000000000..2e1421b27 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala @@ -0,0 +1,87 @@ +package com.tencent.angel.ml.tree.conf + +import com.tencent.angel.ml.tree.conf.Algo._ +import org.apache.spark.mllib.tree.loss.{LogLoss, Loss, SquaredError} + +/** + * Configuration options for [[org.apache.spark.mllib.tree.GradientBoostedTrees]]. + * + * @param treeStrategy Parameters for the tree algorithm. We support regression and binary + * classification for boosting. Impurity setting will be ignored. + * @param loss Loss function used for minimization during gradient boosting. + * @param numIterations Number of iterations of boosting. In other words, the number of + * weak hypotheses used in the final model. + * @param learningRate Learning rate for shrinking the contribution of each estimator. The + * learning rate should be between in the interval (0, 1] + * @param validationTol validationTol is a condition which decides iteration termination when + * runWithValidation is used. + * The end of iteration is decided based on below logic: + * If the current loss on the validation set is greater than 0.01, the diff + * of validation error is compared to relative tolerance which is + * validationTol * (current loss on the validation set). + * If the current loss on the validation set is less than or equal to 0.01, + * the diff of validation error is compared to absolute tolerance which is + * validationTol * 0.01. + * Ignored when + * `org.apache.spark.mllib.tree.GradientBoostedTrees.run()` is used. + */ +case class BoostingStrategy ( + // Required boosting parameters + var treeStrategy: Strategy, var loss: Loss, + // Optional boosting parameters + var numIterations: Int = 100, var learningRate: Float = 0.1f, var validationTol: Float = 0.001f) extends Serializable { + + /** + * Check validity of parameters. + * Throws exception if invalid. + */ + private def assertValid(): Unit = { + treeStrategy.algo match { + case Classification => + require(treeStrategy.numClasses == 2, + "Only binary classification is supported for boosting.") + case Regression => + // nothing + case _ => + throw new IllegalArgumentException( + s"BoostingStrategy given invalid algo parameter: ${treeStrategy.algo}." + + s" Valid settings are: Classification, Regression.") + } + require(learningRate > 0 && learningRate <= 1, + "Learning rate should be in range (0, 1]. Provided learning rate is " + s"$learningRate.") + } +} + +object BoostingStrategy { + + /** + * Returns default configuration for the boosting algorithm + * @param algo Learning goal. Supported: "Classification" or "Regression" + * @return Configuration for boosting algorithm + */ + def defaultParams(algo: String): BoostingStrategy = { + defaultParams(Algo.fromString(algo)) + } + + /** + * Returns default configuration for the boosting algorithm + * @param algo Learning goal. Supported: + * `org.apache.spark.mllib.tree.configuration.Algo.Classification`, + * `org.apache.spark.mllib.tree.configuration.Algo.Regression` + * @return Configuration for boosting algorithm + */ + def defaultParams(algo: Algo): BoostingStrategy = { + val treeStrategy = Strategy.defaultStrategy(algo) + treeStrategy.maxDepth = 3 + algo match { + case Algo.Classification => + treeStrategy.numClasses = 2 + new BoostingStrategy(treeStrategy, LogLoss) + case Algo.Regression => + new BoostingStrategy(treeStrategy, SquaredError) + case _ => + throw new IllegalArgumentException(s"$algo is not supported by boosting.") + } + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala new file mode 100644 index 000000000..9bee0b069 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala @@ -0,0 +1,10 @@ +package com.tencent.angel.ml.tree.conf + +/** + * Enum to select ensemble combining strategy for base learners + */ +private object EnsembleCombiningStrategy extends Enumeration { + type EnsembleCombiningStrategy = Value + val Average, Sum, Vote = Value +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala new file mode 100644 index 000000000..f5eff7b5c --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala @@ -0,0 +1,9 @@ +package com.tencent.angel.ml.tree.conf + +/** + * Enum to describe whether a feature is "continuous" or "categorical" + */ +object FeatureType extends Enumeration { + type FeatureType = Value + val Continuous, Categorical = Value +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala new file mode 100644 index 000000000..0b05d3cf7 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala @@ -0,0 +1,9 @@ +package com.tencent.angel.ml.tree.conf + +/** + * Enum for selecting the quantile calculation strategy + */ +object QuantileStrategy extends Enumeration { + type QuantileStrategy = Value + val Sort, MinMax, ApproxHist = Value +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala new file mode 100644 index 000000000..c78f12690 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -0,0 +1,138 @@ +package com.tencent.angel.ml.tree.conf + +import scala.beans.BeanProperty +import scala.collection.JavaConverters._ + +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.QuantileStrategy._ +import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} + +/** + * Stores all the configuration options for tree construction + * @param algo Learning goal. Supported: Classification, Regression + * @param impurity Criterion used for information gain calculation. + * Supported for Classification: Gini, Entropy. Supported for Regression: Variance + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means 1 internal node + 2 leaf nodes). + * @param numClasses Number of classes for classification. (Ignored for regression.) Default value is 2 (binary classification). + * @param maxBins Maximum number of bins used for discretizing continuous features and for choosing how to split on features at each node. + * @param quantileCalculationStrategy Algorithm for calculating quantiles. Supported: QuantileStrategy.Sort` + * @param categoricalFeaturesInfo A map storing information about the categorical variables and the number of discrete values they take. + * An entry (n to k) indicates that feature n is categorical with k categories indexed from 0: {0, 1, ..., k-1}. + * @param minInstancesPerNode Minimum number of instances each child must have after split. + * Default value is 1. If a split cause left or right child to have less than minInstancesPerNode, this split will not be considered as a valid split. + * @param minInfoGain Minimum information gain a split must get. Default value is 0.0. + * If a split has less information gain than minInfoGain, this split will not be considered as a valid split. + * @param maxMemoryInMB Maximum memory in MB allocated to histogram aggregation. Default value is 256 MB. + * If too small, then 1 node will be split per iteration, and its aggregates may exceed this size. + * @param subsamplingRate Fraction of the training data used for learning decision tree. + * @param useNodeIdCache If this is true, instead of passing trees to executors, the algorithm will maintain a separate RDD of node Id cache for each row. + * @param checkpointInterval How often to checkpoint when the node Id cache gets updated. E.g. 10 means that the cache will get checkpointed every 10 update. + */ +class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impurity, var maxDepth: Int, var numClasses: Int = 2, var maxBins: Int = 32, + var quantileCalculationStrategy: QuantileStrategy = Sort, var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), + var minInstancesPerNode: Int = 1, var minInfoGain: Float = 0.0f, var maxMemoryInMB: Int = 256, + var subsamplingRate: Float = 1, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { + + def isMulticlassClassification: Boolean = { + algo == Classification && numClasses > 2 + } + + def isMulticlassWithCategoricalFeatures: Boolean = { + isMulticlassClassification && (categoricalFeaturesInfo.size > 0) + } + + def this( + algo: Algo, + impurity: Impurity, + maxDepth: Int, + numClasses: Int, + maxBins: Int, + categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]) { + this(algo, impurity, maxDepth, numClasses, maxBins, Sort, + categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap) + } + + /** + * Sets Algorithm using a String. + */ + def setAlgo(algo: String): Unit = algo match { + case "Classification" => setAlgo(Classification) + case "Regression" => setAlgo(Regression) + } + + /** + * Sets categoricalFeaturesInfo using a Java Map. + */ + def setCategoricalFeaturesInfo( + categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]): Unit = { + this.categoricalFeaturesInfo = + categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap + } + + /** + * Check validity of parameters. + * Throws exception if invalid. + */ + private def assertValid(): Unit = { + algo match { + case Classification => + require(numClasses >= 2, + s"DecisionTree Strategy for Classification must have numClasses >= 2," + + s" but numClasses = $numClasses.") + require(Set(Gini, Entropy).contains(impurity), + s"DecisionTree Strategy given invalid impurity for Classification: $impurity." + + s" Valid settings: Gini, Entropy") + case Regression => + require(impurity == Variance, + s"DecisionTree Strategy given invalid impurity for Regression: $impurity." + + s" Valid settings: Variance") + case _ => + throw new IllegalArgumentException( + s"DecisionTree Strategy given invalid algo parameter: $algo." + + s" Valid settings are: Classification, Regression.") + } + require(maxDepth >= 0, s"DecisionTree Strategy given invalid maxDepth parameter: $maxDepth." + + s" Valid values are integers >= 0.") + require(maxBins >= 2, s"DecisionTree Strategy given invalid maxBins parameter: $maxBins." + + s" Valid values are integers >= 2.") + require(minInstancesPerNode >= 1, + s"DecisionTree Strategy requires minInstancesPerNode >= 1 but was given $minInstancesPerNode") + require(maxMemoryInMB <= 10240, + s"DecisionTree Strategy requires maxMemoryInMB <= 10240, but was given $maxMemoryInMB") + require(subsamplingRate > 0 && subsamplingRate <= 1, + s"DecisionTree Strategy requires subsamplingRate <=1 and >0, but was given " + + s"$subsamplingRate") + } + + /** + * Returns a shallow copy of this instance. + */ + def copy: Strategy = { + new Strategy(algo, impurity, maxDepth, numClasses, maxBins, + quantileCalculationStrategy, categoricalFeaturesInfo, minInstancesPerNode, minInfoGain, + maxMemoryInMB, subsamplingRate, useNodeIdCache, checkpointInterval) + } +} + +object Strategy { + + /** + * Construct a default set of parameters for [[org.apache.spark.mllib.tree.DecisionTree]] + * @param algo "Classification" or "Regression" + */ + def defaultStrategy(algo: String): Strategy = { + defaultStrategy(Algo.fromString(algo)) + } + + /** + * Construct a default set of parameters for DecisionTree + * @param Classification or Regression + */ + def defaultStrategy(algo: Algo): Strategy = algo match { + case Algo.Classification => + new Strategy(algo = Classification, impurity = Gini, maxDepth = 10, numClasses = 2) + case Algo.Regression => + new Strategy(algo = Regression, impurity = Variance, maxDepth = 10, numClasses = 0) + } + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala new file mode 100644 index 000000000..5905b7410 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala @@ -0,0 +1,138 @@ +package com.tencent.angel.ml.tree.impurity + +/** + * Class for calculating entropy during multiclass classification. + */ +object Entropy extends Impurity { + + private def log2(x: Float) = scala.math.log(x) / scala.math.log(2) + + /** + * information calculation for multiclass classification + * @param counts Array[Double] with counts for each label + * @param totalCount sum of counts for all labels + * @return information value, or 0 if totalCount = 0 + */ + override def calculate(counts: Array[Float], totalCount: Float): Float = { + if (totalCount == 0) { + return 0 + } + val numClasses = counts.length + var impurity = 0.0f + var classIndex = 0 + while (classIndex < numClasses) { + val classCount = counts(classIndex) + if (classCount != 0) { + val freq = classCount / totalCount + impurity -= freq * log2(freq) + } + classIndex += 1 + } + impurity + } + + /** + * variance calculation + * @param count number of instances + * @param sum sum of labels + * @param sumSquares summation of squares of the labels + * @return information value, or 0 if count = 0 + */ + override def calculate(count: Float, sum: Float, sumSquares: Float): Float = + throw new UnsupportedOperationException("Entropy.calculate") + + /** + * Get this impurity instance. + * This is useful for passing impurity parameters to a Strategy in Java. + */ + def instance: this.type = this + +} + +/** + * Class for updating views of a vector of sufficient statistics, + * in order to compute impurity from a sample. + * Note: Instances of this class do not hold the data; they operate on views of the data. + * @param numClasses Number of classes for label. + */ +private class EntropyAggregator(numClasses: Int) + extends ImpurityAggregator(numClasses) with Serializable { + + /** + * Update stats for one (node, feature, bin) with the given label. + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def update(allStats: Array[Float], offset: Int, label: Float, instanceWeight: Float): Unit = { + if (label >= statsSize) { + throw new IllegalArgumentException(s"EntropyAggregator given label $label" + + s" but requires label < numClasses (= $statsSize).") + } + if (label < 0) { + throw new IllegalArgumentException(s"EntropyAggregator given label $label" + + s"but requires label is non-negative.") + } + allStats(offset + label.toInt) += instanceWeight + } + + /** + * Get an [[ImpurityCalculator]] for a (node, feature, bin). + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def getCalculator(allStats: Array[Float], offset: Int): EntropyCalculator = { + new EntropyCalculator(allStats.view(offset, offset + statsSize).toArray) + } +} + +/** + * Stores statistics for one (node, feature, bin) for calculating impurity. + * Unlike [[EntropyAggregator]], this class stores its own data and is for a specific + * (node, feature, bin). + * @param stats Array of sufficient statistics for a (node, feature, bin). + */ +private class EntropyCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { + + /** + * Make a deep copy of this [[ImpurityCalculator]]. + */ + def copy: EntropyCalculator = new EntropyCalculator(stats.clone()) + + /** + * Calculate the impurity from the stored sufficient statistics. + */ + def calculate(): Float = Entropy.calculate(stats, stats.sum) + + /** + * Number of data points accounted for in the sufficient statistics. + */ + def count: Long = stats.sum.toLong + + /** + * Prediction which should be made based on the sufficient statistics. + */ + def predict: Float = if (count == 0) { + 0 + } else { + indexOfLargestArrayElement(stats) + } + + /** + * Probability of the label given by [[predict]]. + */ + override def prob(label: Float): Float = { + val lbl = label.toInt + require(lbl < stats.length, + s"EntropyCalculator.prob given invalid label: $lbl (should be < ${stats.length}") + require(lbl >= 0, "Entropy does not support negative labels") + val cnt = count + if (cnt == 0) { + 0 + } else { + stats(lbl) / cnt + } + } + + override def toString: String = s"EntropyCalculator(stats = [${stats.mkString(", ")}])" + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala new file mode 100644 index 000000000..3c6c48b37 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala @@ -0,0 +1,135 @@ +package com.tencent.angel.ml.tree.impurity + +/** + * Class for calculating the Gini impurity + * (http://en.wikipedia.org/wiki/Decision_tree_learning#Gini_impurity) + * during multiclass classification. + */ +object Gini extends Impurity { + + /** + * information calculation for multiclass classification + * @param counts Array[Double] with counts for each label + * @param totalCount sum of counts for all labels + * @return information value, or 0 if totalCount = 0 + */ + override def calculate(counts: Array[Float], totalCount: Float): Float = { + if (totalCount == 0) { + return 0 + } + val numClasses = counts.length + var impurity = 1.0f + var classIndex = 0 + while (classIndex < numClasses) { + val freq = counts(classIndex) / totalCount + impurity -= freq * freq + classIndex += 1 + } + impurity + } + + /** + * variance calculation + * @param count number of instances + * @param sum sum of labels + * @param sumSquares summation of squares of the labels + * @return information value, or 0 if count = 0 + */ + override def calculate(count: Float, sum: Float, sumSquares: Float): Float = + throw new UnsupportedOperationException("Gini.calculate") + + /** + * Get this impurity instance. + * This is useful for passing impurity parameters to a Strategy in Java. + */ + def instance: this.type = this + +} + +/** + * Class for updating views of a vector of sufficient statistics, + * in order to compute impurity from a sample. + * Note: Instances of this class do not hold the data; they operate on views of the data. + * @param numClasses Number of classes for label. + */ +private class GiniAggregator(numClasses: Int) + extends ImpurityAggregator(numClasses) with Serializable { + + /** + * Update stats for one (node, feature, bin) with the given label. + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def update(allStats: Array[Float], offset: Int, label: Float, instanceWeight: Float): Unit = { + if (label >= statsSize) { + throw new IllegalArgumentException(s"GiniAggregator given label $label" + + s" but requires label < numClasses (= $statsSize).") + } + if (label < 0) { + throw new IllegalArgumentException(s"GiniAggregator given label $label" + + s"but requires label is non-negative.") + } + allStats(offset + label.toInt) += instanceWeight + } + + /** + * Get an [[ImpurityCalculator]] for a (node, feature, bin). + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def getCalculator(allStats: Array[Float], offset: Int): GiniCalculator = { + new GiniCalculator(allStats.view(offset, offset + statsSize).toArray) + } +} + +/** + * Stores statistics for one (node, feature, bin) for calculating impurity. + * Unlike [[GiniAggregator]], this class stores its own data and is for a specific + * (node, feature, bin). + * @param stats Array of sufficient statistics for a (node, feature, bin). + */ +private class GiniCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { + + /** + * Make a deep copy of this [[ImpurityCalculator]]. + */ + def copy: GiniCalculator = new GiniCalculator(stats.clone()) + + /** + * Calculate the impurity from the stored sufficient statistics. + */ + def calculate(): Float = Gini.calculate(stats, stats.sum) + + /** + * Number of data points accounted for in the sufficient statistics. + */ + def count: Long = stats.sum.toLong + + /** + * Prediction which should be made based on the sufficient statistics. + */ + def predict: Float = if (count == 0) { + 0 + } else { + indexOfLargestArrayElement(stats) + } + + /** + * Probability of the label given by [[predict]]. + */ + override def prob(label: Float): Float = { + val lbl = label.toInt + require(lbl < stats.length, + s"GiniCalculator.prob given invalid label: $lbl (should be < ${stats.length}") + require(lbl >= 0, "GiniImpurity does not support negative labels") + val cnt = count + if (cnt == 0) { + 0 + } else { + stats(lbl) / cnt + } + } + + override def toString: String = s"GiniCalculator(stats = [${stats.mkString(", ")}])" + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala new file mode 100644 index 000000000..cc8f6e979 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala @@ -0,0 +1,16 @@ +package com.tencent.angel.ml.tree.impurity + +/** + * Factory for Impurity instances. + */ +private object Impurities { + + def fromString(name: String): Impurity = name match { + case "gini" => Gini + case "entropy" => Entropy + case "variance" => Variance + case _ => throw new IllegalArgumentException(s"Did not recognize Impurity name: $name") + } + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala new file mode 100644 index 000000000..95568583b --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala @@ -0,0 +1,172 @@ +package com.tencent.angel.ml.tree.impurity + +import java.util.Locale + +/** + * Trait for calculating information gain. + * This trait is used for + * (a) setting the impurity parameter in [[org.apache.spark.mllib.tree.configuration.Strategy]] + * (b) calculating impurity values from sufficient statistics. + */ +trait Impurity extends Serializable { + + /** + * information calculation for multiclass classification + * @param counts Array[Double] with counts for each label + * @param totalCount sum of counts for all labels + * @return information value, or 0 if totalCount = 0 + */ + def calculate(counts: Array[Float], totalCount: Float): Float + + /** + * information calculation for regression + * @param count number of instances + * @param sum sum of labels + * @param sumSquares summation of squares of the labels + * @return information value, or 0 if count = 0 + */ + def calculate(count: Float, sum: Float, sumSquares: Float): Float +} + +/** + * Interface for updating views of a vector of sufficient statistics, + * in order to compute impurity from a sample. + * Note: Instances of this class do not hold the data; they operate on views of the data. + * @param statsSize Length of the vector of sufficient statistics for one bin. + */ +private abstract class ImpurityAggregator(val statsSize: Int) extends Serializable { + + /** + * Merge the stats from one bin into another. + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for (node, feature, bin) which is modified by the merge. + * @param otherOffset Start index of stats for (node, feature, other bin) which is not modified. + */ + def merge(allStats: Array[Float], offset: Int, otherOffset: Int): Unit = { + var i = 0 + while (i < statsSize) { + allStats(offset + i) += allStats(otherOffset + i) + i += 1 + } + } + + /** + * Update stats for one (node, feature, bin) with the given label. + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def update(allStats: Array[Float], offset: Int, label: Float, instanceWeight: Float): Unit + + /** + * Get an [[ImpurityCalculator]] for a (node, feature, bin). + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def getCalculator(allStats: Array[Float], offset: Int): ImpurityCalculator +} + +/** + * Stores statistics for one (node, feature, bin) for calculating impurity. + * Unlike [[ImpurityAggregator]], this class stores its own data and is for a specific + * (node, feature, bin). + * @param stats Array of sufficient statistics for a (node, feature, bin). + */ +private[tree] abstract class ImpurityCalculator(val stats: Array[Float]) extends Serializable { + + /** + * Make a deep copy of this [[ImpurityCalculator]]. + */ + def copy: ImpurityCalculator + + /** + * Calculate the impurity from the stored sufficient statistics. + */ + def calculate(): Float + + /** + * Add the stats from another calculator into this one, modifying and returning this calculator. + */ + def add(other: ImpurityCalculator): ImpurityCalculator = { + require(stats.length == other.stats.length, + s"Two ImpurityCalculator instances cannot be added with different counts sizes." + + s" Sizes are ${stats.length} and ${other.stats.length}.") + var i = 0 + val len = other.stats.length + while (i < len) { + stats(i) += other.stats(i) + i += 1 + } + this + } + + /** + * Subtract the stats from another calculator from this one, modifying and returning this + * calculator. + */ + def subtract(other: ImpurityCalculator): ImpurityCalculator = { + require(stats.length == other.stats.length, + s"Two ImpurityCalculator instances cannot be subtracted with different counts sizes." + + s" Sizes are ${stats.length} and ${other.stats.length}.") + var i = 0 + val len = other.stats.length + while (i < len) { + stats(i) -= other.stats(i) + i += 1 + } + this + } + + /** + * Number of data points accounted for in the sufficient statistics. + */ + def count: Long + + /** + * Prediction which should be made based on the sufficient statistics. + */ + def predict: Float + + /** + * Probability of the label given by [[predict]], or -1 if no probability is available. + */ + def prob(label: Float): Float = -1 + + /** + * Return the index of the largest array element. + * Fails if the array is empty. + */ + protected def indexOfLargestArrayElement(array: Array[Float]): Int = { + val result = array.foldLeft((-1, Double.MinValue, 0)) { + case ((maxIndex, maxValue, currentIndex), currentValue) => + if (currentValue > maxValue) { + (currentIndex, currentValue, currentIndex + 1) + } else { + (maxIndex, maxValue, currentIndex + 1) + } + } + if (result._1 < 0) { + throw new RuntimeException("ImpurityCalculator internal error:" + + " indexOfLargestArrayElement failed") + } + result._1 + } + +} + +private object ImpurityCalculator { + + /** + * Create an [[ImpurityCalculator]] instance of the given impurity type and with + * the given stats. + */ + def getCalculator(impurity: String, stats: Array[Float]): ImpurityCalculator = { + impurity.toLowerCase(Locale.ROOT) match { + case "gini" => new GiniCalculator(stats) + case "entropy" => new EntropyCalculator(stats) + case "variance" => new VarianceCalculator(stats) + case _ => + throw new IllegalArgumentException( + s"ImpurityCalculator builder did not recognize impurity type: $impurity") + } + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala new file mode 100644 index 000000000..883ab412d --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala @@ -0,0 +1,110 @@ +package com.tencent.angel.ml.tree.impurity + +/** + * Class for calculating variance during regression + */ +object Variance extends Impurity { + + /** + * information calculation for multiclass classification + * @param counts Array[Double] with counts for each label + * @param totalCount sum of counts for all labels + * @return information value, or 0 if totalCount = 0 + */ + override def calculate(counts: Array[Float], totalCount: Float): Float = + throw new UnsupportedOperationException("Variance.calculate") + + /** + * variance calculation + * @param count number of instances + * @param sum sum of labels + * @param sumSquares summation of squares of the labels + * @return information value, or 0 if count = 0 + */ + override def calculate(count: Float, sum: Float, sumSquares: Float): Float = { + if (count == 0) { + return 0 + } + val squaredLoss = sumSquares - (sum * sum) / count + squaredLoss / count + } + + /** + * Get this impurity instance. + * This is useful for passing impurity parameters to a Strategy in Java. + */ + def instance: this.type = this + +} + +/** + * Class for updating views of a vector of sufficient statistics, + * in order to compute impurity from a sample. + * Note: Instances of this class do not hold the data; they operate on views of the data. + */ +private class VarianceAggregator() + extends ImpurityAggregator(statsSize = 3) with Serializable { + + /** + * Update stats for one (node, feature, bin) with the given label. + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def update(allStats: Array[Float], offset: Int, label: Float, instanceWeight: Float): Unit = { + allStats(offset) += instanceWeight + allStats(offset + 1) += instanceWeight * label + allStats(offset + 2) += instanceWeight * label * label + } + + /** + * Get an [[ImpurityCalculator]] for a (node, feature, bin). + * @param allStats Flat stats array, with stats for this (node, feature, bin) contiguous. + * @param offset Start index of stats for this (node, feature, bin). + */ + def getCalculator(allStats: Array[Float], offset: Int): VarianceCalculator = { + new VarianceCalculator(allStats.view(offset, offset + statsSize).toArray) + } +} + +/** + * Stores statistics for one (node, feature, bin) for calculating impurity. + * Unlike [[GiniAggregator]], this class stores its own data and is for a specific + * (node, feature, bin). + * @param stats Array of sufficient statistics for a (node, feature, bin). + */ +private class VarianceCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { + + require(stats.length == 3, + s"VarianceCalculator requires sufficient statistics array stats to be of length 3," + + s" but was given array of length ${stats.length}.") + + /** + * Make a deep copy of this [[ImpurityCalculator]]. + */ + def copy: VarianceCalculator = new VarianceCalculator(stats.clone()) + + /** + * Calculate the impurity from the stored sufficient statistics. + */ + def calculate(): Float = Variance.calculate(stats(0), stats(1), stats(2)) + + /** + * Number of data points accounted for in the sufficient statistics. + */ + def count: Long = stats(0).toLong + + /** + * Prediction which should be made based on the sufficient statistics. + */ + def predict: Float = if (count == 0) { + 0 + } else { + stats(1) / count + } + + override def toString: String = { + s"VarianceAggregator(cnt = ${stats(0)}, sum = ${stats(1)}, sum2 = ${stats(2)})" + } + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala new file mode 100644 index 000000000..041d232aa --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala @@ -0,0 +1,29 @@ +package com.tencent.angel.ml.tree.loss + +/** + * Class for absolute error loss calculation (for regression). + * + * The absolute (L1) error is defined as: + * |y - F(x)| + * where y is the label and F(x) is the model prediction for features x. + */ +object AbsoluteError extends Loss { + + /** + * Method to calculate the gradients for the gradient boosting calculation for least + * absolute error calculation. + * The gradient with respect to F(x) is: sign(F(x) - y) + * @param prediction Predicted label. + * @param label True label. + * @return Loss gradient + */ + override def gradient(prediction: Double, label: Double): Double = { + if (label - prediction < 0) 1.0 else -1.0 + } + + override private[spark] def computeError(prediction: Double, label: Double): Double = { + val err = label - prediction + math.abs(err) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala new file mode 100644 index 000000000..10259d166 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala @@ -0,0 +1,45 @@ +package com.tencent.angel.ml.tree.loss + +import org.apache.spark.mllib.util.MLUtils + +/** + * Class for log loss calculation (for classification). + * This uses twice the binomial negative log likelihood, called "deviance" in Friedman (1999). + * + * The log loss is defined as: + * 2 log(1 + exp(-2 y F(x))) + * where y is a label in {-1, 1} and F(x) is the model prediction for features x. + */ +object LogLoss extends ClassificationLoss { + + /** + * Method to calculate the loss gradients for the gradient boosting calculation for binary + * classification + * The gradient with respect to F(x) is: - 4 y / (1 + exp(2 y F(x))) + * @param prediction Predicted label. + * @param label True label. + * @return Loss gradient + */ + override def gradient(prediction: Double, label: Double): Double = { + - 4.0 * label / (1.0 + math.exp(2.0 * label * prediction)) + } + + override private[spark] def computeError(prediction: Double, label: Double): Double = { + val margin = 2.0 * label * prediction + // The following is equivalent to 2.0 * log(1 + exp(-margin)) but more numerically stable. + if (-margin > 0) { + 2 * (-margin + math.log1p(math.exp(margin))) + } else { + 2 * math.log1p(math.exp(-margin)) + } + 2.0 * MLUtils.log1pExp(-margin) + } + + /** + * Returns the estimated probability of a label of 1.0. + */ + override private[spark] def computeProbability(margin: Double): Double = { + 1.0 / (1.0 + math.exp(-2.0 * margin)) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala new file mode 100644 index 000000000..5ee95811b --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala @@ -0,0 +1,52 @@ +package com.tencent.angel.ml.tree.loss + +import com.tencent.angel.ml.feature.LabeledData +import org.apache.spark.mllib.tree.model.TreeEnsembleModel + +/** + * Trait for adding "pluggable" loss functions for the gradient boosting algorithm. + */ +trait Loss extends Serializable { + + /** + * Method to calculate the gradients for the gradient boosting calculation. + * @param prediction Predicted feature + * @param label true label. + * @return Loss gradient. + */ + def gradient(prediction: Double, label: Double): Double + + /** + * Method to calculate error of the base learner for the gradient boosting calculation. + * + * @param model Model of the weak learner. + * @param data Training dataset: List of LabeledData + * @return Measure of model error on data + * + * @note This method is not used by the gradient boosting algorithm but is useful for debugging + * purposes. + */ + def computeError(model: TreeEnsembleModel, data: List[LabeledData]): Double = { + data.map(point => computeError(model.predict(point.getX), point.getY)).mean() + } + + /** + * Method to calculate loss when the predictions are already known. + * + * @param prediction Predicted label. + * @param label True label. + * @return Measure of model error on datapoint. + * + * @note This method is used in the method evaluateEachIteration to avoid recomputing the + * predicted values from previously fit trees. + */ + private[mllib] def computeError(prediction: Double, label: Double): Double +} + +private[tree] trait ClassificationLoss extends Loss { + /** + * Computes the class probability given the margin. + */ + private[mllib] def computeProbability(margin: Double): Double +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Losses.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Losses.scala new file mode 100644 index 000000000..0f68a3150 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Losses.scala @@ -0,0 +1,12 @@ +package com.tencent.angel.ml.tree.loss + +object Losses { + + def fromString(name: String): Loss = name match { + case "leastSquaresError" => SquaredError + case "leastAbsoluteError" => AbsoluteError + case "logLoss" => LogLoss + case _ => throw new IllegalArgumentException(s"Did not recognize Loss name: $name") + } + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala new file mode 100644 index 000000000..ee2f3e85b --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala @@ -0,0 +1,29 @@ +package com.tencent.angel.ml.tree.loss + +/** + * Class for squared error loss calculation. + * + * The squared (L2) error is defined as: + * (y - F(x))**2 + * where y is the label and F(x) is the model prediction for features x. + */ +object SquaredError extends Loss { + + /** + * Method to calculate the gradients for the gradient boosting calculation for least + * squares error calculation. + * The gradient with respect to F(x) is: - 2 (y - F(x)) + * @param prediction Predicted label. + * @param label True label. + * @return Loss gradient + */ + override def gradient(prediction: Double, label: Double): Double = { + - 2.0 * (label - prediction) + } + + override private[mllib] def computeError(prediction: Double, label: Double): Double = { + val err = label - prediction + err * err + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala new file mode 100644 index 000000000..1eb1f6bdc --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala @@ -0,0 +1,250 @@ +package com.tencent.angel.ml.tree.model + +import java.text.DecimalFormat + +import scala.collection.mutable +import scala.beans.BeanProperty +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.model.MLModel +import com.tencent.angel.ml.predict.PredictResult +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.{Algo, FeatureType} +import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration + +object DecisionTreeModel { + + val SKETCH_MAT: String = "gbdt.sketch" + val FEAT_SAMPLE_MAT: String = "gbdt.feature.sample" + val FEAT_CATEGORY_MAT = "gbdt.feature.category" + val SPLIT_FEAT_MAT: String = "gbdt.split.feature" + val SPLIT_VALUE_MAT: String = "gbdt.split.value" + val SPLIT_GAIN_MAT: String = "gbdt.split.gain" + val NODE_PRED_MAT: String = "gbdt.node.predict" + + def apply(conf: Configuration) = { + new DecisionTreeModel(conf) + } + + def apply(ctx: TaskContext, conf: Configuration) = { + new DecisionTreeModel(conf, ctx) + } + + private[mllib] object DataStruct { + + case class PredictData(predict: Float, prob: Float) { + def toPredict: Predict = new Predict(predict, prob) + } + + object PredictData { + def apply(p: Predict): PredictData = PredictData(p.predict, p.prob) + + def apply(vec: IntFloatVector): PredictData = PredictData(vec.get(3), vec.get(4)) + } + + case class SplitData( + feature: Int, + threshold: Float, + featureType: Int, + categories: Seq[Float]) { + def toSplit: Split = { + new Split(feature, threshold, FeatureType(featureType), categories.toList) + } + } + + object SplitData { + def apply(s: Split): SplitData = { + SplitData(s.feature, s.threshold, s.featureType.id, s.categories) + } + + def apply(vec: IntFloatVector): SplitData = { + SplitData(vec.get(9).toInt, vec.get(10), vec.get(11).toInt, vec.get((12 to vec.dim.toInt).toArray)) + } + } + + /** Model data for model import/export + * 0: treeId + * 1: nodeId (-1 means null) + * 2: pred + * 3: pred_prob + * 4: impurity + * 5: isLeaf (1=true) + * 6: leafChildId (-1 means null) + * 7: rightChildId (-1 means null) + * 8: infoGain + * 9: splitFeature + * 10: splitThreshold + * 11: splitType + * 12 to end: categories + * */ + case class NodeData( + treeId: Int, + nodeId: Int, + predict: PredictData, + impurity: Float, + isLeaf: Boolean, + leftNodeId: Option[Int], + rightNodeId: Option[Int], + infoGain: Option[Float], + split: Option[SplitData]) + + object NodeData { + def apply(treeId: Int, n: Node): NodeData = { + NodeData(treeId, n.id, PredictData(n.predict), n.impurity, n.isLeaf, n.leftNode.map(_.id), n.rightNode.map(_.id), + n.stats.map(_.gain), n.split.map(SplitData.apply)) + } + + def apply(vec: IntFloatVector): NodeData = { + val leftNodeId = if (vec.get(6) == -1) None else Some(vec.get(6).toInt) + val rightNodeId = if (vec.get(7) == -1) None else Some(vec.get(7).toInt) + val infoGain = if (vec.get(8) < 0) None else Some(vec.get(8)) + val split = if (vec.get(9) == -1) None else Some(SplitData(vec)) + NodeData(vec.get(0).toInt, vec.get(1).toInt, PredictData(vec), vec.get(4), + vec.get(5) == 1.0, leftNodeId, rightNodeId, infoGain, split) + } + } + + def constructTrees(nodes: List[NodeData]): Array[Node] = { + val trees: List[(Int, Node)] = nodes.groupBy(_.treeId) + .mapValues(_.toArray) + .map { case (treeId, data) => + (treeId, constructTree(data)) + }.toList.sortBy(_._1) + val numTrees = trees.length + val treeIndices = trees.map(_._1).toSeq + assert(treeIndices == (0 until numTrees), + s"Tree indices must start from 0 and increment by 1, but we found $treeIndices.") + trees.map(_._2) + } + + /** + * Given a list of nodes from a tree, construct the tree. + * @param data array of all node data in a tree. + */ + def constructTree(data: Array[NodeData]): Node = { + val dataMap: Map[Int, NodeData] = data.map(n => n.nodeId -> n).toMap + assert(dataMap.contains(1), + s"DecisionTree missing root node (id = 1).") + constructNode(1, dataMap, mutable.Map.empty) + } + + /** + * Builds a node from the node data map and adds new nodes to the input nodes map. + */ + private def constructNode( + id: Int, + dataMap: Map[Int, NodeData], + nodes: mutable.Map[Int, Node]): Node = { + if (nodes.contains(id)) { + return nodes(id) + } + val data = dataMap(id) + val node = + if (data.isLeaf) { + Node(data.nodeId, data.predict.toPredict, data.impurity, data.isLeaf) + } else { + val leftNode = constructNode(data.leftNodeId.get, dataMap, nodes) + val rightNode = constructNode(data.rightNodeId.get, dataMap, nodes) + val stats = new InformationGainStats(data.infoGain.get, data.impurity, leftNode.impurity, + rightNode.impurity, leftNode.predict, rightNode.predict) + new Node(data.nodeId, data.predict.toPredict, data.impurity, data.isLeaf, + data.split.map(_.toSplit), Some(leftNode), Some(rightNode), Some(stats)) + } + nodes += node.id -> node + node + } + } + +} + +/** + * Decision tree model for classification or regression. + * This model stores the decision tree structure and parameters. + * @param topNode root node + * @param algo algorithm type -- classification or regression + */ +class DecisionTreeModel (@BeanProperty val topNode: Node, val algo: Algo, conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { + + super.setSavePath(conf) + super.setLoadPath(conf) + + override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { + val ret = new MemoryDataBlock[PredictResult](-1) + + (0 until dataSet.size).foreach { idx => + val instance = dataSet.read + val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] + val y = instance.getY + val pred = predict(x) + + ret.put(new DecisionTreePredictResult(idx, y, pred)) + } + + ret + } + + /** + * Predict values for a single data point using the model trained. + * + * @param features array representing a single data point + * @return Double prediction from the trained model + */ + def predict(features: IntFloatVector): Double = { + topNode.predict(features) + } + + /** + * Predict values for the given data set using the model trained. + * + * @param features RDD representing data points to be predicted + * @return RDD of predictions for each of the given data points + */ + def predict(features: List[IntFloatVector]): List[Double] = { + features.map(x => predict(x)) + } + + /** + * Get number of nodes in tree, including leaf nodes. + */ + def numNodes: Int = { + 1 + topNode.numDescendants + } + + /** + * Get depth of tree. + * E.g.: Depth 0 means 1 leaf node. Depth 1 means 1 internal node and 2 leaf nodes. + */ + def depth: Int = { + topNode.subtreeDepth + } + + /** + * Print a summary of the model. + */ + override def toString: String = algo match { + case Classification => + s"DecisionTreeModel classifier of depth $depth with $numNodes nodes" + case Regression => + s"DecisionTreeModel regressor of depth $depth with $numNodes nodes" + case _ => throw new IllegalArgumentException( + s"DecisionTreeModel given unknown algo parameter: $algo.") + } + + /** + * Print the full model to a string. + */ + def toDebugString: String = { + val header = toString + "\n" + header + topNode.subtreeToString(2) + } +} + +case class DecisionTreePredictResult(sid: Long, pred: Double, label: Double) extends PredictResult { + val df = new DecimalFormat("0") + + override def getText: String = { + df.format(sid) + separator + format.format(pred) + separator + df.format(label) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala new file mode 100644 index 000000000..46582c073 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala @@ -0,0 +1,106 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.tree.impurity.ImpurityCalculator + +/** + * Information gain statistics for each split + * @param gain information gain value + * @param impurity current node impurity + * @param leftImpurity left node impurity + * @param rightImpurity right node impurity + * @param leftPredict left node predict + * @param rightPredict right node predict + */ +class InformationGainStats( + val gain: Float, + val impurity: Float, + val leftImpurity: Float, + val rightImpurity: Float, + val leftPredict: Predict, + val rightPredict: Predict) extends Serializable { + + override def toString: String = { + s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + + s"right impurity = $rightImpurity" + } + + override def equals(o: Any): Boolean = o match { + case other: InformationGainStats => + gain == other.gain && + impurity == other.impurity && + leftImpurity == other.leftImpurity && + rightImpurity == other.rightImpurity && + leftPredict == other.leftPredict && + rightPredict == other.rightPredict + + case _ => false + } + + override def hashCode: Int = { + com.google.common.base.Objects.hashCode( + gain: java.lang.Float, + impurity: java.lang.Float, + leftImpurity: java.lang.Float, + rightImpurity: java.lang.Float, + leftPredict, + rightPredict) + } +} + +/** + * Impurity statistics for each split + * @param gain information gain value + * @param impurity current node impurity + * @param impurityCalculator impurity statistics for current node + * @param leftImpurityCalculator impurity statistics for left child node + * @param rightImpurityCalculator impurity statistics for right child node + * @param valid whether the current split satisfies minimum info gain or + * minimum number of instances per node + */ +private[tree] class ImpurityStats( + val gain: Float, + val impurity: Float, + val impurityCalculator: ImpurityCalculator, + val leftImpurityCalculator: ImpurityCalculator, + val rightImpurityCalculator: ImpurityCalculator, + val valid: Boolean = true) extends Serializable { + + override def toString: String = { + s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + + s"right impurity = $rightImpurity" + } + + def leftImpurity: Float = if (leftImpurityCalculator != null) { + leftImpurityCalculator.calculate() + } else { + -1.0f + } + + def rightImpurity: Float = if (rightImpurityCalculator != null) { + rightImpurityCalculator.calculate() + } else { + -1.0f + } +} + +private[tree] object ImpurityStats { + + /** + * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object to + * denote that current split doesn't satisfies minimum info gain or + * minimum number of instances per node. + */ + def getInvalidImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { + new ImpurityStats(Float.MinValue, impurityCalculator.calculate(), + impurityCalculator, null, null, false) + } + + /** + * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object + * that only 'impurity' and 'impurityCalculator' are defined. + */ + def getEmptyImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { + new ImpurityStats(Float.NaN, impurityCalculator.calculate(), impurityCalculator, null, null) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala new file mode 100644 index 000000000..d183318b7 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala @@ -0,0 +1,225 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.conf.FeatureType._ + +/** + * Node in a decision tree. + * + * About node indexing: + * Nodes are indexed from 1. Node 1 is the root; nodes 2, 3 are the left, right children. + * Node index 0 is not used. + * + * @param id integer node id, from 1 + * @param predict predicted value at the node + * @param impurity current node impurity + * @param isLeaf whether the node is a leaf + * @param split split to calculate left and right nodes + * @param leftNode left child + * @param rightNode right child + * @param stats information gain stats + */ +class Node ( + val id: Int, + var predict: Predict, + var impurity: Float, + var isLeaf: Boolean, + var split: Option[Split], + var leftNode: Option[Node], + var rightNode: Option[Node], + var stats: Option[InformationGainStats]) extends Serializable { + + override def toString: String = { + s"id = $id, isLeaf = $isLeaf, predict = $predict, impurity = $impurity, " + + s"split = $split, stats = $stats" + } + + /** + * predict value if node is not leaf + * @param features feature value + * @return predicted value + */ + def predict(features: IntFloatVector): Double = { + if (isLeaf) { + predict.predict + } else { + if (split.get.featureType == Continuous) { + if (features.get(split.get.feature) <= split.get.threshold) { + leftNode.get.predict(features) + } else { + rightNode.get.predict(features) + } + } else { + if (split.get.categories.contains(features.get(split.get.feature))) { + leftNode.get.predict(features) + } else { + rightNode.get.predict(features) + } + } + } + } + + /** + * Returns a deep copy of the subtree rooted at this node. + */ + private[mllib] def deepCopy(): Node = { + val leftNodeCopy = if (leftNode.isEmpty) { + None + } else { + Some(leftNode.get.deepCopy()) + } + val rightNodeCopy = if (rightNode.isEmpty) { + None + } else { + Some(rightNode.get.deepCopy()) + } + new Node(id, predict, impurity, isLeaf, split, leftNodeCopy, rightNodeCopy, stats) + } + + /** + * Get the number of nodes in tree below this node, including leaf nodes. + * E.g., if this is a leaf, returns 0. If both children are leaves, returns 2. + */ + private[mllib] def numDescendants: Int = if (isLeaf) { + 0 + } else { + 2 + leftNode.get.numDescendants + rightNode.get.numDescendants + } + + /** + * Get depth of tree from this node. + * E.g.: Depth 0 means this is a leaf node. + */ + private[mllib] def subtreeDepth: Int = if (isLeaf) { + 0 + } else { + 1 + math.max(leftNode.get.subtreeDepth, rightNode.get.subtreeDepth) + } + + /** + * Recursive print function. + * @param indentFactor The number of spaces to add to each level of indentation. + */ + private[mllib] def subtreeToString(indentFactor: Int = 0): String = { + + def splitToString(split: Split, left: Boolean): String = { + split.featureType match { + case Continuous => if (left) { + s"(feature ${split.feature} <= ${split.threshold})" + } else { + s"(feature ${split.feature} > ${split.threshold})" + } + case Categorical => if (left) { + s"(feature ${split.feature} in ${split.categories.mkString("{", ",", "}")})" + } else { + s"(feature ${split.feature} not in ${split.categories.mkString("{", ",", "}")})" + } + } + } + val prefix: String = " " * indentFactor + if (isLeaf) { + prefix + s"Predict: ${predict.predict}\n" + } else { + prefix + s"If ${splitToString(split.get, left = true)}\n" + + leftNode.get.subtreeToString(indentFactor + 1) + + prefix + s"Else ${splitToString(split.get, left = false)}\n" + + rightNode.get.subtreeToString(indentFactor + 1) + } + } + + /** Returns an iterator that traverses (DFS, left to right) the subtree of this node. */ + private[mllib] def subtreeIterator: Iterator[Node] = { + Iterator.single(this) ++ leftNode.map(_.subtreeIterator).getOrElse(Iterator.empty) ++ + rightNode.map(_.subtreeIterator).getOrElse(Iterator.empty) + } +} + +private[tree] object Node { + + /** + * Return a node with the given node id (but nothing else set). + */ + def emptyNode(nodeIndex: Int): Node = new Node(nodeIndex, new Predict(Float.MinValue), -1.0f, + false, None, None, None, None) + + /** + * Construct a node with nodeIndex, predict, impurity and isLeaf parameters. + * This is used in `DecisionTree.findBestSplits` to construct child nodes + * after finding the best splits for parent nodes. + * Other fields are set at next level. + * @param nodeIndex integer node id, from 1 + * @param predict predicted value at the node + * @param impurity current node impurity + * @param isLeaf whether the node is a leaf + * @return new node instance + */ + def apply( + nodeIndex: Int, + predict: Predict, + impurity: Float, + isLeaf: Boolean): Node = { + new Node(nodeIndex, predict, impurity, isLeaf, None, None, None, None) + } + + /** + * Return the index of the left child of this node. + */ + def leftChildIndex(nodeIndex: Int): Int = nodeIndex << 1 + + /** + * Return the index of the right child of this node. + */ + def rightChildIndex(nodeIndex: Int): Int = (nodeIndex << 1) + 1 + + /** + * Get the parent index of the given node, or 0 if it is the root. + */ + def parentIndex(nodeIndex: Int): Int = nodeIndex >> 1 + + /** + * Return the level of a tree which the given node is in. + */ + def indexToLevel(nodeIndex: Int): Int = if (nodeIndex == 0) { + throw new IllegalArgumentException(s"0 is not a valid node index.") + } else { + java.lang.Integer.numberOfTrailingZeros(java.lang.Integer.highestOneBit(nodeIndex)) + } + + /** + * Returns true if this is a left child. + * Note: Returns false for the root. + */ + def isLeftChild(nodeIndex: Int): Boolean = nodeIndex > 1 && nodeIndex % 2 == 0 + + /** + * Return the maximum number of nodes which can be in the given level of the tree. + * @param level Level of tree (0 = root). + */ + def maxNodesInLevel(level: Int): Int = 1 << level + + /** + * Return the index of the first node in the given level. + * @param level Level of tree (0 = root). + */ + def startIndexInLevel(level: Int): Int = 1 << level + + /** + * Traces down from a root node to get the node with the given node index. + * This assumes the node exists. + */ + def getNode(nodeIndex: Int, rootNode: Node): Node = { + var tmpNode: Node = rootNode + var levelsToGo = indexToLevel(nodeIndex) + while (levelsToGo > 0) { + if ((nodeIndex & (1 << levelsToGo - 1)) == 0) { + tmpNode = tmpNode.leftNode.get + } else { + tmpNode = tmpNode.rightNode.get + } + levelsToGo -= 1 + } + tmpNode + } + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala new file mode 100644 index 000000000..56a8647e3 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala @@ -0,0 +1,25 @@ +package com.tencent.angel.ml.tree.model + +/** + * Predicted value for a node + * @param predict predicted value + * @param prob probability of the label (classification only) + */ +class Predict ( + val predict: Float, + val prob: Float = 0.0f) extends Serializable { + + override def toString: String = s"$predict (prob = $prob)" + + override def equals(other: Any): Boolean = { + other match { + case p: Predict => predict == p.predict && prob == p.prob + case _ => false + } + } + + override def hashCode: Int = { + com.google.common.base.Objects.hashCode(predict: java.lang.Float, prob: java.lang.Float) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala new file mode 100644 index 000000000..7fd00ff01 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala @@ -0,0 +1,49 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.tree.conf.FeatureType.FeatureType + +/** + * Split applied to a feature + * @param feature feature index + * @param threshold Threshold for continuous feature. + * Split left if feature is less than or equal to threshold, else right. + * @param featureType type of feature -- categorical or continuous + * @param categories Split left if categorical feature value is in this set, else right. + */ +case class Split( + feature: Int, + threshold: Float, + featureType: FeatureType, + categories: List[Float]) { + + override def toString: String = { + s"Feature = $feature, threshold = $threshold, featureType = $featureType, " + + s"categories = $categories" + } +} + +/** + * Split with minimum threshold for continuous features. Helps with the smallest bin creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyLowSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MinValue, featureType, List()) + +/** + * Split with maximum threshold for continuous features. Helps with the highest bin creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyHighSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MaxValue, featureType, List()) + +/** + * Split with no acceptable feature values for categorical features. Helps with the first bin + * creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyCategoricalSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MaxValue, featureType, List()) + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala new file mode 100644 index 000000000..9541b3bbd --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala @@ -0,0 +1,206 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.ml.feature.LabeledData + +import scala.collection.mutable +import com.tencent.angel.ml.math2.VFactory +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.model.MLModel +import com.tencent.angel.ml.predict.PredictResult +import com.tencent.angel.ml.tree.conf.Algo +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy._ +import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} +import com.tencent.angel.worker.task.TaskContext + +/** + * Represents a random forest model. + * + * @param algo algorithm for the ensemble model, either Classification or Regression + * @param trees tree ensembles + */ +class RandomForestModel ( + override val algo: Algo, + override val trees: Array[DecisionTreeModel]) + extends TreeEnsembleModel(algo, trees, Array.fill(trees.length)(1.0), + combiningStrategy = if (algo == Classification) Vote else Average) { + + require(trees.forall(_.algo == algo)) +} + +/** + * Represents a tree ensemble model. + * + * @param algo algorithm for the ensemble model, either Classification or Regression + * @param trees tree ensembles + * @param treeWeights tree ensemble weights + * @param combiningStrategy strategy for combining the predictions, not used for regression. + */ +private[tree] sealed class TreeEnsembleModel( + protected val algo: Algo, + protected val trees: Array[DecisionTreeModel], + protected val treeWeights: Array[Double], + protected val combiningStrategy: EnsembleCombiningStrategy, + conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { + + require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") + + private val sumWeights = math.max(treeWeights.sum, 1e-15) + + super.setSavePath(conf) + super.setLoadPath(conf) + + override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { + val ret = new MemoryDataBlock[PredictResult](-1) + + (0 until dataSet.size).foreach { idx => + val instance = dataSet.read + val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] + val y = instance.getY + val pred = predict(x) + + ret.put(new DecisionTreePredictResult(idx, y, pred)) + } + + ret + } + + + + /** + * Predicts for a single data point using the weighted sum of ensemble predictions. + * + * @param features array representing a single data point + * @return predicted category from the trained model + */ + private def predictBySumming(features: IntFloatVector): Double = { + trees.zip(treeWeights).map{ case (tree, weight) => + tree.predict(features) * weight + }.sum + } + + /** + * Classifies a single data point based on (weighted) majority votes. + */ + private def predictByVoting(features: IntFloatVector): Double = { + val votes = mutable.Map.empty[Int, Double] + trees.view.zip(treeWeights).foreach { case (tree, weight) => + val prediction = tree.predict(features).toInt + votes(prediction) = votes.getOrElse(prediction, 0.0) + weight + } + votes.maxBy(_._2)._1 + } + + /** + * Predict values for a single data point using the model trained. + * + * @param features array representing a single data point + * @return predicted category from the trained model + */ + def predict(features: IntFloatVector): Double = { + (algo, combiningStrategy) match { + case (Regression, Sum) => + predictBySumming(features) + case (Regression, Average) => + predictBySumming(features) / sumWeights + case (Classification, Sum) => // binary classification + val prediction = predictBySumming(features) + // TODO: predicted labels are +1 or -1 for GBT. Need a better way to store this info. + if (prediction > 0.0) 1.0 else 0.0 + case (Classification, Vote) => + predictByVoting(features) + case _ => + throw new IllegalArgumentException( + "TreeEnsembleModel given unsupported (algo, combiningStrategy) combination: " + + s"($algo, $combiningStrategy).") + } + } + + /** + * Predict values for the given data set. + * + * @param features RDD representing data points to be predicted + * @return RDD[Double] where each entry contains the corresponding prediction + */ + def predict(features: List[IntFloatVector]): List[Double] = features.map(x => predict(x)) + + def predict(features: Array[IntFloatVector]): Array[Double] = { + predict(features.toList) + } + + /** + * Print a summary of the model. + */ + override def toString: String = { + algo match { + case Classification => + s"TreeEnsembleModel classifier with $numTrees trees\n" + case Regression => + s"TreeEnsembleModel regressor with $numTrees trees\n" + case _ => throw new IllegalArgumentException( + s"TreeEnsembleModel given unknown algo parameter: $algo.") + } + } + + /** + * Print the full model to a string. + */ + def toDebugString: String = { + val header = toString + "\n" + header + trees.zipWithIndex.map { case (tree, treeIndex) => + s" Tree $treeIndex:\n" + tree.topNode.subtreeToString(4) + }.fold("")(_ + _) + } + + /** + * Get number of trees in ensemble. + */ + def numTrees: Int = trees.length + + /** + * Get total number of nodes, summed over all trees in the ensemble. + */ + def totalNumNodes: Int = trees.map(_.numNodes).sum +} + +private[tree] object TreeEnsembleModel { + + object SaveUtils { + + import com.tencent.angel.ml.tree.model.DecisionTreeModel.DataStruct.{NodeData, constructTrees} + + case class Metadata( + algo: String, + treeAlgo: String, + combiningStrategy: String, + treeWeights: Array[Double]) + + /** + * Model data for model import/export. + * We have to duplicate NodeData here since Spark SQL does not yet support extracting subfields + * of nested fields; once that is possible, we can use something like: + * case class EnsembleNodeData(treeId: Int, node: NodeData), + * where NodeData is from DecisionTreeModel. + */ + case class EnsembleNodeData(treeId: Int, node: NodeData) + + def save(path: String, model: TreeEnsembleModel, className: String): Unit = { + + // Create JSON metadata. + val ensembleMetadata = Metadata(model.algo.toString, model.trees(0).algo.toString, + model.combiningStrategy.toString, model.treeWeights) + } + + /** + * Load trees for an ensemble, and return them in order. + * @param path path to load the model from + * @param treeAlgo Algorithm for individual trees (which may differ from the ensemble's + * algorithm). + */ + def loadTrees( + path: String, + treeAlgo: String): Array[DecisionTreeModel] = ??? + } + +} From 10835df43d1da13e1a9a0b65faac1f6f9f04d713 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 13 Nov 2018 18:49:26 +0800 Subject: [PATCH 003/115] DT learner and params --- .../angel/ml/tree/DecisionTreeLearner.scala | 219 +++++++++ .../angel/ml/tree/RandomForestLearner.scala | 266 ++++++++++ .../com/tencent/angel/ml/tree/conf/Algo.scala | 2 +- .../angel/ml/tree/conf/BoostingStrategy.scala | 4 +- .../tree/conf/EnsembleCombiningStrategy.scala | 2 +- .../tencent/angel/ml/tree/conf/Strategy.scala | 6 +- .../angel/ml/tree/conf/TreeParams.scala | 446 +++++++++++++++++ .../angel/ml/tree/impurity/Entropy.scala | 4 +- .../angel/ml/tree/loss/AbsoluteError.scala | 2 +- .../tencent/angel/ml/tree/loss/LogLoss.scala | 5 +- .../com/tencent/angel/ml/tree/loss/Loss.scala | 12 +- .../angel/ml/tree/loss/SquaredError.scala | 2 +- .../ml/tree/model/DecisionTreeModel.scala | 18 +- .../angel/ml/tree/model/NewTreeModels.scala | 463 ++++++++++++++++++ .../tencent/angel/ml/tree/model/Node.scala | 12 +- .../ml/tree/model/TreeEnsembleModels.scala | 22 +- 16 files changed, 1440 insertions(+), 45 deletions(-) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala new file mode 100644 index 000000000..2f53e49b0 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala @@ -0,0 +1,219 @@ +package com.tencent.angel.ml.tree + +import com.tencent.angel.ml.core.MLLearner +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.model.MLModel +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.QuantileStrategy._ +import com.tencent.angel.ml.tree.conf.{Algo, Strategy} +import com.tencent.angel.ml.tree.impurity._ +import com.tencent.angel.ml.tree.model._ +import com.tencent.angel.worker.storage.DataBlock +import com.tencent.angel.worker.task.TaskContext + +/** + * A class which implements a decision tree learning algorithm for classification and regression. + * It supports both continuous and categorical features. + * + * @param strategy The configuration parameters for the tree algorithm which specify the type + * of decision tree (classification or regression), feature type (continuous, + * categorical), depth of the tree, quantile calculation strategy, etc. + * @param seed Random seed. + */ +class DecisionTreeLearner (ctx: TaskContext, val strategy: Strategy, val seed: Int) extends MLLearner(ctx) { + + /** + * @param strategy The configuration parameters for the tree algorithm which specify the type + * of decision tree (classification or regression), feature type (continuous, + * categorical), depth of the tree, quantile calculation strategy, etc. + */ + def this(ctx: TaskContext, strategy: Strategy) = this(ctx, strategy, seed = 0) + def this(ctx: TaskContext) = this(ctx, Strategy.defaultStrategy(Algo.Classification)) + + strategy.assertValid() + + /** + * Method to train a decision tree model over an RDD + * + * @param trainData : trainning data storage + * @param validationData : validation data storage + */ + override + def train(trainData: DataBlock[LabeledData], validationData: DataBlock[LabeledData]): MLModel = { + val rf = new RandomForestLearner(strategy, numTrees = 1, featureSubsetStrategy = "all", seed = seed) + val rfModel = rf.run(input) + rfModel.trees(0) + } +} + +object DecisionTree { + + /** + * Method to train a decision tree model. + * The method supports binary and multiclass classification and regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * For classification, labels should take values {0, 1, ..., numClasses-1}. + * For regression, labels are real numbers. + * @param strategy The configuration parameters for the tree algorithm which specify the type + * of decision tree (classification or regression), feature type (continuous, + * categorical), depth of the tree, quantile calculation strategy, etc. + * @return DecisionTreeModel that can be used for prediction. + * + * @note Using `org.apache.spark.mllib.tree.DecisionTree.trainClassifier` + * and `org.apache.spark.mllib.tree.DecisionTree.trainRegressor` + * is recommended to clearly separate classification and regression. + */ + def train(input: RDD[LabeledPoint], strategy: Strategy): DecisionTreeModel = { + new DecisionTree(strategy).run(input) + } + + /** + * Method to train a decision tree model. + * The method supports binary and multiclass classification and regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * For classification, labels should take values {0, 1, ..., numClasses-1}. + * For regression, labels are real numbers. + * @param algo Type of decision tree, either classification or regression. + * @param impurity Criterion used for information gain calculation. + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * @return DecisionTreeModel that can be used for prediction. + * + * @note Using `org.apache.spark.mllib.tree.DecisionTree.trainClassifier` + * and `org.apache.spark.mllib.tree.DecisionTree.trainRegressor` + * is recommended to clearly separate classification and regression. + */ + def train( + input: RDD[LabeledPoint], + algo: Algo, + impurity: Impurity, + maxDepth: Int): DecisionTreeModel = { + val strategy = new Strategy(algo, impurity, maxDepth) + new DecisionTree(strategy).run(input) + } + + /** + * Method to train a decision tree model. + * The method supports binary and multiclass classification and regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * For classification, labels should take values {0, 1, ..., numClasses-1}. + * For regression, labels are real numbers. + * @param algo Type of decision tree, either classification or regression. + * @param impurity Criterion used for information gain calculation. + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * @param numClasses Number of classes for classification. Default value of 2. + * @return DecisionTreeModel that can be used for prediction. + * + * @note Using `org.apache.spark.mllib.tree.DecisionTree.trainClassifier` + * and `org.apache.spark.mllib.tree.DecisionTree.trainRegressor` + * is recommended to clearly separate classification and regression. + */ + def train( + input: RDD[LabeledPoint], + algo: Algo, + impurity: Impurity, + maxDepth: Int, + numClasses: Int): DecisionTreeModel = { + val strategy = new Strategy(algo, impurity, maxDepth, numClasses) + new DecisionTree(strategy).run(input) + } + + /** + * Method to train a decision tree model. + * The method supports binary and multiclass classification and regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * For classification, labels should take values {0, 1, ..., numClasses-1}. + * For regression, labels are real numbers. + * @param algo Type of decision tree, either classification or regression. + * @param impurity Criterion used for information gain calculation. + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * @param numClasses Number of classes for classification. Default value of 2. + * @param maxBins Maximum number of bins used for splitting features. + * @param quantileCalculationStrategy Algorithm for calculating quantiles. + * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * indicates that feature n is categorical with k categories + * indexed from 0: {0, 1, ..., k-1}. + * @return DecisionTreeModel that can be used for prediction. + * + * @note Using `org.apache.spark.mllib.tree.DecisionTree.trainClassifier` + * and `org.apache.spark.mllib.tree.DecisionTree.trainRegressor` + * is recommended to clearly separate classification and regression. + */ + def train( + input: RDD[LabeledPoint], + algo: Algo, + impurity: Impurity, + maxDepth: Int, + numClasses: Int, + maxBins: Int, + quantileCalculationStrategy: QuantileStrategy, + categoricalFeaturesInfo: Map[Int, Int]): DecisionTreeModel = { + val strategy = new Strategy(algo, impurity, maxDepth, numClasses, maxBins, + quantileCalculationStrategy, categoricalFeaturesInfo) + new DecisionTree(strategy).run(input) + } + + /** + * Method to train a decision tree model for binary or multiclass classification. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels should take values {0, 1, ..., numClasses-1}. + * @param numClasses Number of classes for classification. + * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * indicates that feature n is categorical with k categories + * indexed from 0: {0, 1, ..., k-1}. + * @param impurity Criterion used for information gain calculation. + * Supported values: "gini" (recommended) or "entropy". + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * (suggested value: 5) + * @param maxBins Maximum number of bins used for splitting features. + * (suggested value: 32) + * @return DecisionTreeModel that can be used for prediction. + */ + def trainClassifier( + input: RDD[LabeledPoint], + numClasses: Int, + categoricalFeaturesInfo: Map[Int, Int], + impurity: String, + maxDepth: Int, + maxBins: Int): DecisionTreeModel = { + val impurityType = Impurities.fromString(impurity) + train(input, Classification, impurityType, maxDepth, numClasses, maxBins, Sort, + categoricalFeaturesInfo) + } + + /** + * Method to train a decision tree model for regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels are real numbers. + * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * indicates that feature n is categorical with k categories + * indexed from 0: {0, 1, ..., k-1}. + * @param impurity Criterion used for information gain calculation. + * The only supported value for regression is "variance". + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * (suggested value: 5) + * @param maxBins Maximum number of bins used for splitting features. + * (suggested value: 32) + * @return DecisionTreeModel that can be used for prediction. + */ + def trainRegressor( + input: RDD[LabeledPoint], + categoricalFeaturesInfo: Map[Int, Int], + impurity: String, + maxDepth: Int, + maxBins: Int): DecisionTreeModel = { + val impurityType = Impurities.fromString(impurity) + train(input, Regression, impurityType, maxDepth, 0, maxBins, Sort, categoricalFeaturesInfo) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala new file mode 100644 index 000000000..3031a8559 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -0,0 +1,266 @@ +package com.tencent.angel.ml.tree + +import com.tencent.angel.ml.core.MLLearner +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.model.MLModel + +import scala.util.Try + +import org.apache.spark.ml.tree.{DecisionTreeModel => NewDTModel, TreeEnsembleParams => NewRFParams} +import org.apache.spark.ml.tree.impl.{RandomForest => NewRandomForest} +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.QuantileStrategy._ +import com.tencent.angel.ml.tree.conf.Strategy +import com.tencent.angel.ml.tree.impurity.Impurities +import com.tencent.angel.ml.tree.model._ +import com.tencent.angel.worker.storage.DataBlock +import com.tencent.angel.worker.task.TaskContext + +/** + * A class that implements a Random Forest + * learning algorithm for classification and regression. + * It supports both continuous and categorical features. + * + * The settings for featureSubsetStrategy are based on the following references: + * - log2: tested in Breiman (2001) + * - sqrt: recommended by Breiman manual for random forests + * - The defaults of sqrt (classification) and onethird (regression) match the R randomForest + * package. + * + * @see Breiman (2001) + * @see + * Breiman manual for random forests + * @param strategy The configuration parameters for the random forest algorithm which specify + * the type of random forest (classification or regression), feature type + * (continuous, categorical), depth of the tree, quantile calculation strategy, + * etc. + * @param numTrees If 1, then no bootstrapping is used. If greater than 1, then bootstrapping is + * done. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * Supported numerical values: "(0.0-1.0]", "[1-n]". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "sqrt" for + * classification and to "onethird" for regression. + * If a real value "n" in the range (0, 1.0] is set, + * use n * number of features. + * If an integer value "n" in the range (1, num features) is set, + * use n features. + * @param seed Random seed for bootstrapping and choosing feature subsets. + */ +class RandomForest ( + val ctx: TaskContext, + val strategy: Strategy, + val numTrees: Int, + featureSubsetStrategy: String, + val seed: Int) + extends MLLearner(ctx) { + + strategy.assertValid() + require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") + require(RandomForest.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) + || Try(featureSubsetStrategy.toInt).filter(_ > 0).isSuccess + || Try(featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, + s"RandomForest given invalid featureSubsetStrategy: $featureSubsetStrategy." + + s" Supported values: ${NewRFParams.supportedFeatureSubsetStrategies.mkString(", ")}," + + s" (0.0-1.0], [1-n].") + + /** + * Method to train a decision tree model over an RDD + * + * @param input Training data: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @return RandomForestModel that can be used for prediction. + */ + override + def train(trainData: DataBlock[LabeledData], validationData: DataBlock[LabeledData]): MLModel = { + val trees: Array[NewDTModel] = NewRandomForest.run(input.map(_.asML), strategy, numTrees, + featureSubsetStrategy, seed.toLong, None) + new RandomForestModel(strategy.algo, trees.map(_.toOld)) + } + +} + +object RandomForest { + + /** + * Method to train a decision tree model for binary or multiclass classification. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels should take values {0, 1, ..., numClasses-1}. + * @param strategy Parameters for training each tree in the forest. + * @param numTrees Number of trees in the random forest. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "sqrt". + * @param seed Random seed for bootstrapping and choosing feature subsets. + * @return RandomForestModel that can be used for prediction. + */ + def trainClassifier( + input: RDD[LabeledPoint], + strategy: Strategy, + numTrees: Int, + featureSubsetStrategy: String, + seed: Int): RandomForestModel = { + require(strategy.algo == Classification, + s"RandomForest.trainClassifier given Strategy with invalid algo: ${strategy.algo}") + val rf = new RandomForest(strategy, numTrees, featureSubsetStrategy, seed) + rf.run(input) + } + + /** + * Method to train a decision tree model for binary or multiclass classification. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels should take values {0, 1, ..., numClasses-1}. + * @param numClasses Number of classes for classification. + * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * indicates that feature n is categorical with k categories + * indexed from 0: {0, 1, ..., k-1}. + * @param numTrees Number of trees in the random forest. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "sqrt". + * @param impurity Criterion used for information gain calculation. + * Supported values: "gini" (recommended) or "entropy". + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * (suggested value: 4) + * @param maxBins Maximum number of bins used for splitting features + * (suggested value: 100) + * @param seed Random seed for bootstrapping and choosing feature subsets. + * @return RandomForestModel that can be used for prediction. + */ + @Since("1.2.0") + def trainClassifier( + input: RDD[LabeledPoint], + numClasses: Int, + categoricalFeaturesInfo: Map[Int, Int], + numTrees: Int, + featureSubsetStrategy: String, + impurity: String, + maxDepth: Int, + maxBins: Int, + seed: Int = Utils.random.nextInt()): RandomForestModel = { + val impurityType = Impurities.fromString(impurity) + val strategy = new Strategy(Classification, impurityType, maxDepth, + numClasses, maxBins, Sort, categoricalFeaturesInfo) + trainClassifier(input, strategy, numTrees, featureSubsetStrategy, seed) + } + + /** + * Java-friendly API for `org.apache.spark.mllib.tree.RandomForest.trainClassifier` + */ + @Since("1.2.0") + def trainClassifier( + input: JavaRDD[LabeledPoint], + numClasses: Int, + categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer], + numTrees: Int, + featureSubsetStrategy: String, + impurity: String, + maxDepth: Int, + maxBins: Int, + seed: Int): RandomForestModel = { + trainClassifier(input.rdd, numClasses, + categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap, + numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed) + } + + /** + * Method to train a decision tree model for regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels are real numbers. + * @param strategy Parameters for training each tree in the forest. + * @param numTrees Number of trees in the random forest. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "onethird". + * @param seed Random seed for bootstrapping and choosing feature subsets. + * @return RandomForestModel that can be used for prediction. + */ + @Since("1.2.0") + def trainRegressor( + input: RDD[LabeledPoint], + strategy: Strategy, + numTrees: Int, + featureSubsetStrategy: String, + seed: Int): RandomForestModel = { + require(strategy.algo == Regression, + s"RandomForest.trainRegressor given Strategy with invalid algo: ${strategy.algo}") + val rf = new RandomForest(strategy, numTrees, featureSubsetStrategy, seed) + rf.run(input) + } + + /** + * Method to train a decision tree model for regression. + * + * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * Labels are real numbers. + * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * indicates that feature n is categorical with k categories + * indexed from 0: {0, 1, ..., k-1}. + * @param numTrees Number of trees in the random forest. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "onethird". + * @param impurity Criterion used for information gain calculation. + * The only supported value for regression is "variance". + * @param maxDepth Maximum depth of the tree. (e.g., depth 0 means 1 leaf node, depth 1 means + * 1 internal node + 2 leaf nodes). + * (suggested value: 4) + * @param maxBins Maximum number of bins used for splitting features. + * (suggested value: 100) + * @param seed Random seed for bootstrapping and choosing feature subsets. + * @return RandomForestModel that can be used for prediction. + */ + @Since("1.2.0") + def trainRegressor( + input: RDD[LabeledPoint], + categoricalFeaturesInfo: Map[Int, Int], + numTrees: Int, + featureSubsetStrategy: String, + impurity: String, + maxDepth: Int, + maxBins: Int, + seed: Int = Utils.random.nextInt()): RandomForestModel = { + val impurityType = Impurities.fromString(impurity) + val strategy = new Strategy(Regression, impurityType, maxDepth, + 0, maxBins, Sort, categoricalFeaturesInfo) + trainRegressor(input, strategy, numTrees, featureSubsetStrategy, seed) + } + + /** + * Java-friendly API for `org.apache.spark.mllib.tree.RandomForest.trainRegressor` + */ + @Since("1.2.0") + def trainRegressor( + input: JavaRDD[LabeledPoint], + categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer], + numTrees: Int, + featureSubsetStrategy: String, + impurity: String, + maxDepth: Int, + maxBins: Int, + seed: Int): RandomForestModel = { + trainRegressor(input.rdd, + categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap, + numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed) + } + + /** + * List of supported feature subset sampling strategies. + */ + @Since("1.2.0") + val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala index 3e900b2b5..44896cb53 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala @@ -9,7 +9,7 @@ object Algo extends Enumeration { val Classification, Regression = Value - private[mllib] def fromString(name: String): Algo = name match { + def fromString(name: String): Algo = name match { case "classification" | "Classification" => Classification case "regression" | "Regression" => Regression case _ => throw new IllegalArgumentException(s"Did not recognize Algo name: $name") diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala index 2e1421b27..477699fee 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala @@ -1,7 +1,7 @@ package com.tencent.angel.ml.tree.conf import com.tencent.angel.ml.tree.conf.Algo._ -import org.apache.spark.mllib.tree.loss.{LogLoss, Loss, SquaredError} +import com.tencent.angel.ml.tree.loss.{LogLoss, Loss, SquaredError} /** * Configuration options for [[org.apache.spark.mllib.tree.GradientBoostedTrees]]. @@ -29,7 +29,7 @@ case class BoostingStrategy ( // Required boosting parameters var treeStrategy: Strategy, var loss: Loss, // Optional boosting parameters - var numIterations: Int = 100, var learningRate: Float = 0.1f, var validationTol: Float = 0.001f) extends Serializable { + var numIterations: Int = 100, var learningRate: Double = 0.1f, var validationTol: Double = 0.01) extends Serializable { /** * Check validity of parameters. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala index 9bee0b069..b493d9577 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala @@ -3,7 +3,7 @@ package com.tencent.angel.ml.tree.conf /** * Enum to select ensemble combining strategy for base learners */ -private object EnsembleCombiningStrategy extends Enumeration { +object EnsembleCombiningStrategy extends Enumeration { type EnsembleCombiningStrategy = Value val Average, Sum, Vote = Value } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index c78f12690..5b51b6151 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -30,8 +30,8 @@ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} */ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impurity, var maxDepth: Int, var numClasses: Int = 2, var maxBins: Int = 32, var quantileCalculationStrategy: QuantileStrategy = Sort, var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), - var minInstancesPerNode: Int = 1, var minInfoGain: Float = 0.0f, var maxMemoryInMB: Int = 256, - var subsamplingRate: Float = 1, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { + var minInstancesPerNode: Int = 1, var minInfoGain: Double = 0.0, var maxMemoryInMB: Int = 256, + var subsamplingRate: Double = 1, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { def isMulticlassClassification: Boolean = { algo == Classification && numClasses > 2 @@ -73,7 +73,7 @@ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impur * Check validity of parameters. * Throws exception if invalid. */ - private def assertValid(): Unit = { + def assertValid(): Unit = { algo match { case Classification => require(numClasses >= 2, diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala new file mode 100644 index 000000000..f81773f33 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala @@ -0,0 +1,446 @@ +package com.tencent.angel.ml.tree.conf + +import java.util.Locale + +import scala.util.Try +import org.apache.spark.ml.param.shared._ +import org.apache.spark.ml.util.SchemaUtils +import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo, BoostingStrategy => OldBoostingStrategy, Strategy => OldStrategy} +import com.tencent.angel.ml.tree.impurity.{Entropy => OldEntropy, Gini => OldGini, Impurity => OldImpurity, Variance => OldVariance} +import com.tencent.angel.ml.tree.loss.{AbsoluteError => OldAbsoluteError, ClassificationLoss => OldClassificationLoss, LogLoss => OldLogLoss, Loss => OldLoss, SquaredError => OldSquaredError} +import org.apache.spark.ml.param.{IntParam, ParamValidators} + +/** + * Parameters for Decision Tree-based algorithms. + * + * Note: Marked as private and DeveloperApi since this may be made public in the future. + */ +trait DecisionTreeParams { + + /** + * Maximum depth of the tree (>= 0). + * E.g., depth 0 means 1 leaf node; depth 1 means 1 internal node + 2 leaf nodes. + * (default = 5) + * @group param + */ + final var maxDepth: Int = 5 + final val maxDepthInfo = "maxDepth: Maximum depth of the tree. (>= 0)" + + " E.g., depth 0 means 1 leaf node; depth 1 means 1 internal node + 2 leaf nodes." + + /** + * Maximum number of bins used for discretizing continuous features and for choosing how to split + * on features at each node. More bins give higher granularity. + * Must be >= 2 and >= number of categories in any categorical feature. + * (default = 32) + * @group param + */ + final var maxBins: Int = 32 + final val maxBinsInfo = "maxBins: Max number of bins for discretizing continuous features." + + " Must be >=2 and >= number of categories for any categorical feature." + + /** + * Minimum number of instances each child must have after split. + * If a split causes the left or right child to have fewer than minInstancesPerNode, + * the split will be discarded as invalid. + * Should be >= 1. + * (default = 1) + * @group param + */ + final var minInstancesPerNode: Int = 1 + final val minInstancesPerNodeInfo = "minInstancesPerNode: Minimum number of instances each child must have after split." + + " If a split causes the left or right child to have fewer than minInstancesPerNode," + + " the split will be discarded as invalid. Should be >= 1." + + /** + * Minimum information gain for a split to be considered at a tree node. + * Should be >= 0.0. + * (default = 0.0) + * @group param + */ + final var minInfoGain: Double = 0.0 + final val minInfoGainInfo = "minInfoGain: Minimum information gain for a split to be considered at a tree node." + + /** + * Maximum memory in MB allocated to histogram aggregation. If too small, then 1 node will be + * split per iteration, and its aggregates may exceed this size. + * (default = 256 MB) + * @group expertParam + */ + final var maxMemoryInMB: Int = 256 + final val maxMemoryInMBInfo = "maxMemoryInMB: Maximum memory in MB allocated to histogram aggregation." + + /** + * If false, the algorithm will pass trees to executors to match instances with nodes. + * If true, the algorithm will cache node IDs for each instance. + * Caching can speed up training of deeper trees. Users can set how often should the + * cache be checkpointed or disable it by setting checkpointInterval. + * (default = false) + * @group expertParam + */ + final var cacheNodeIds: Boolean = false + final val cacheNodeIdsInfo = "cacheNodeIds: If false, the algorithm will pass trees to executors to" + + " match instances with nodes. If true, the algorithm will cache node IDs for each instance. " + + " Caching can speed up training of deeper trees." + + + def setMaxDepth(value: Int): Unit = maxDepth = value + + def getMaxDepth: Int = maxDepth + + def setMaxBins(value: Int): Unit = maxBins = value + + def getMaxBins: Int = maxBins + + def setMinInstancesPerNode(value: Int): Unit = minInstancesPerNode = value + + def getMinInstancesPerNode: Int = minInstancesPerNode + + def setMinInfoGain(value: Double): Unit = minInfoGain = value + + def getMinInfoGain: Double = minInfoGain + + def setMaxMemoryInMB(value: Int): Unit = maxMemoryInMB = value + + final def getMaxMemoryInMB: Int = maxMemoryInMB + + def setCacheNodeIds(value: Boolean): Unit = cacheNodeIds = value + + final def getCacheNodeIds: Boolean = cacheNodeIds + + + def getOldStrategy( + categoricalFeatures: Map[Int, Int], + numClasses: Int, + oldAlgo: OldAlgo.Algo, + oldImpurity: OldImpurity, + subsamplingRate: Double): OldStrategy = { + val strategy = OldStrategy.defaultStrategy(oldAlgo) + strategy.impurity = oldImpurity + strategy.maxBins = getMaxBins + strategy.maxDepth = getMaxDepth + strategy.maxMemoryInMB = getMaxMemoryInMB + strategy.minInfoGain = getMinInfoGain + strategy.minInstancesPerNode = getMinInstancesPerNode + strategy.useNodeIdCache = getCacheNodeIds + strategy.numClasses = numClasses + strategy.categoricalFeaturesInfo = categoricalFeatures + strategy.subsamplingRate = subsamplingRate + strategy + } +} + +/** + * Parameters for Decision Tree-based classification algorithms. + */ +trait TreeClassifierParams { + + /** + * Criterion used for information gain calculation (case-insensitive). + * Supported: "entropy" and "gini". + * (default = gini) + * @group param + */ + final var impurity = "gini" + final val impurityInfo = "impurity: Criterion used for information gain calculation (case-insensitive). Supported options:" + + s" ${TreeClassifierParams.supportedImpurities.mkString(", ")}" + + def setImpurity(value: String): Unit = impurity = value + + def getImpurity: String = impurity.toLowerCase(Locale.ROOT) + + /** Convert new impurity to old impurity. */ + def getOldImpurity: OldImpurity = { + getImpurity match { + case "entropy" => OldEntropy + case "gini" => OldGini + case _ => + // Should never happen because of check in setter method. + throw new RuntimeException( + s"TreeClassifierParams was given unrecognized impurity: $impurity.") + } + } +} + +object TreeClassifierParams { + // These options should be lowercase. + final val supportedImpurities: Array[String] = + Array("entropy", "gini").map(_.toLowerCase(Locale.ROOT)) +} + +trait DecisionTreeClassifierParams + extends DecisionTreeParams with TreeClassifierParams + +/** + * Parameters for Decision Tree-based regression algorithms. + */ +trait TreeRegressorParams { + + /** + * Criterion used for information gain calculation (case-insensitive). + * Supported: "variance". + * (default = variance) + * @group param + */ + final var impurity = "variance" + final val impurityInfo = "impurity: Criterion used for information gain calculation (case-insensitive). Supported options:" + + s" ${TreeRegressorParams.supportedImpurities.mkString(", ")}" + + def setImpurity(value: String): Unit = impurity = value + + def getImpurity: String = impurity.toLowerCase(Locale.ROOT) + + /** Convert new impurity to old impurity. */ + private[ml] def getOldImpurity: OldImpurity = { + getImpurity match { + case "variance" => OldVariance + case _ => + // Should never happen because of check in setter method. + throw new RuntimeException( + s"TreeRegressorParams was given unrecognized impurity: $impurity") + } + } +} + +object TreeRegressorParams { + // These options should be lowercase. + final val supportedImpurities: Array[String] = + Array("variance").map(_.toLowerCase(Locale.ROOT)) +} + +trait DecisionTreeRegressorParams + extends DecisionTreeParams with TreeRegressorParams + +object TreeEnsembleParams { + // These options should be lowercase. + final val supportedFeatureSubsetStrategies: Array[String] = + Array("auto", "all", "onethird", "sqrt", "log2").map(_.toLowerCase(Locale.ROOT)) +} + +/** + * Parameters for Decision Tree-based ensemble algorithms. + * + * Note: Marked as private and DeveloperApi since this may be made public in the future. + */ +trait TreeEnsembleParams extends DecisionTreeParams { + + /** + * Fraction of the training data used for learning each decision tree, in range (0, 1]. + * (default = 1.0) + * @group param + */ + final var subsamplingRate: Double = 1.0 + final val subsamplingRateInfo = "subsamplingRate: Fraction of the training data used for" + + " learning each decision tree, in range (0, 1]." + + def setSubsamplingRate(value: Double): Unit = subsamplingRate = value + + def getSubsamplingRate: Double = subsamplingRate + + def getOldStrategy( + categoricalFeatures: Map[Int, Int], + numClasses: Int, + oldAlgo: OldAlgo.Algo, + oldImpurity: OldImpurity): OldStrategy = { + super.getOldStrategy(categoricalFeatures, numClasses, oldAlgo, oldImpurity, getSubsamplingRate) + } + + /** + * The number of features to consider for splits at each tree node. + * Supported options: + * - "auto": Choose automatically for task: + * If numTrees == 1, set to "all." + * If numTrees > 1 (forest), set to "sqrt" for classification and + * to "onethird" for regression. + * - "all": use all features + * - "onethird": use 1/3 of the features + * - "sqrt": use sqrt(number of features) + * - "log2": use log2(number of features) + * - "n": when n is in the range (0, 1.0], use n * number of features. When n + * is in the range (1, number of features), use n features. + * (default = "auto") + * + * These various settings are based on the following references: + * - log2: tested in Breiman (2001) + * - sqrt: recommended by Breiman manual for random forests + * - The defaults of sqrt (classification) and onethird (regression) match the R randomForest + * package. + * @see Breiman (2001) + * @see + * Breiman manual for random forests + * + * @group param + */ + final var featureSubsetStrategy = "auto" + final val featureSubsetStrategyInfo = "featureSubsetStrategy: The number of features to consider for splits at each tree node." + + s" Supported options: ${TreeEnsembleParams.supportedFeatureSubsetStrategies.mkString(", ")},, (0.0-1.0], [1-n]." + + def setFeatureSubsetStrategy(value: String): Unit = featureSubsetStrategy = value + + final def getFeatureSubsetStrategy: String = featureSubsetStrategy.toLowerCase(Locale.ROOT) +} + +/** + * Parameters for Random Forest algorithms. + */ +trait RandomForestParams extends TreeEnsembleParams { + + /** + * Number of trees to train (>= 1). + * If 1, then no bootstrapping is used. If > 1, then bootstrapping is done. + * TODO: Change to always do bootstrapping (simpler). SPARK-7130 + * (default = 20) + * + * Note: The reason that we cannot add this to both GBT and RF (i.e. in TreeEnsembleParams) + * is the param `maxIter` controls how many trees a GBT has. The semantics in the algorithms + * are a bit different. + * @group param + */ + final var numTrees: Int = 20 + final val numTreesInfo = "numTrees: Number of trees to train (>= 1)." + + def setNumTrees(value: Int): Unit = numTrees = value + + def getNumTrees: Int = numTrees +} + +trait RandomForestClassifierParams + extends RandomForestParams with TreeClassifierParams + +trait RandomForestRegressorParams + extends RandomForestParams with TreeRegressorParams + +/** + * Parameters for Gradient-Boosted Tree algorithms. + * + * Note: Marked as private and DeveloperApi since this may be made public in the future. + */ +trait GBTParams extends TreeEnsembleParams { + + /** + * Threshold for stopping early when fit with validation is used. + * (This parameter is ignored when fit without validation is used.) + * The decision to stop early is decided based on this logic: + * If the current loss on the validation set is greater than 0.01, the diff + * of validation error is compared to relative tolerance which is + * validationTol * (current loss on the validation set). + * If the current loss on the validation set is less than or equal to 0.01, + * the diff of validation error is compared to absolute tolerance which is validationTol * 0.01. + * @group param + * @see validationIndicatorCol + */ + final var validationTol: Double = 0.01 + final val validationTolInfo = "validationTol: Threshold for stopping early when fit with validation is used." + + " If the error rate on the validation input changes by less than the validationTol," + + " then learning will stop early (before `maxIter`). This parameter is ignored when fit without validation is used." + + def getValidationTol: Double = validationTol + + /** + * Param for maximum number of iterations (>= 0). + * @group param + */ + final var maxIter: Int = 20 + final val maxIterInfo = "maxIter: maximum number of iterations (>= 0)" + + def getMaxIter: Int = maxIter + + def setMaxIter(value: Int): Unit = maxIter = value + + /** + * Param for Step size (a.k.a. learning rate) in interval (0, 1] for shrinking + * the contribution of each estimator. + * (default = 0.1) + * @group param + */ + final var stepSize: Double = 0.1 + final val stepSizeInfo = "stepSize: Step size (a.k.a. learning rate) in interval (0, 1] for" + + " shrinking the contribution of each estimator." + + def getStepSize: Double = stepSize + + def setStepSize(value: Double): Unit = stepSize = value + + setFeatureSubsetStrategy("all") + + /** (private[ml]) Create a BoostingStrategy instance to use with the old API. */ + def getOldBoostingStrategy( + categoricalFeatures: Map[Int, Int], + oldAlgo: OldAlgo.Algo): OldBoostingStrategy = { + val strategy = super.getOldStrategy(categoricalFeatures, numClasses = 2, oldAlgo, OldVariance) + // NOTE: The old API does not support "seed" so we ignore it. + new OldBoostingStrategy(strategy, getOldLossType, getMaxIter, getStepSize, getValidationTol) + } + + /** Get old Gradient Boosting Loss type */ + def getOldLossType: OldLoss +} + +object GBTClassifierParams { + // The losses below should be lowercase. + /** Accessor for supported loss settings: logistic */ + final val supportedLossTypes: Array[String] = + Array("logistic").map(_.toLowerCase(Locale.ROOT)) +} + +trait GBTClassifierParams extends GBTParams with TreeClassifierParams { + + /** + * Loss function which GBT tries to minimize. (case-insensitive) + * Supported: "logistic" + * (default = logistic) + * @group param + */ + var lossType = "logistic" + val lossTypeInfo = "lossType: Loss function which GBT tries to minimize (case-insensitive). Supported options:" + + s" ${GBTClassifierParams.supportedLossTypes.mkString(", ")}" + + def getLossType: String = lossType.toLowerCase(Locale.ROOT) + + /** (private[ml]) Convert new loss to old loss. */ + def getOldLossType: OldClassificationLoss = { + getLossType match { + case "logistic" => OldLogLoss + case _ => + // Should never happen because of check in setter method. + throw new RuntimeException(s"GBTClassifier was given bad loss type: $getLossType") + } + } +} + +object GBTRegressorParams { + // The losses below should be lowercase. + /** Accessor for supported loss settings: squared (L2), absolute (L1) */ + final val supportedLossTypes: Array[String] = + Array("squared", "absolute").map(_.toLowerCase(Locale.ROOT)) +} + +trait GBTRegressorParams extends GBTParams with TreeRegressorParams { + + /** + * Loss function which GBT tries to minimize. (case-insensitive) + * Supported: "squared" (L2) and "absolute" (L1) + * (default = squared) + * @group param + */ + var lossType = "squared" + val lossTypeInfo = "lossType: Loss function which GBT tries to minimize (case-insensitive). Supported options:" + + s" ${GBTRegressorParams.supportedLossTypes.mkString(", ")}" + + def getLossType: String = lossType.toLowerCase(Locale.ROOT) + + /** (private[ml]) Convert new loss to old loss. */ + def getOldLossType: OldLoss = { + convertToOldLossType(getLossType) + } + + def convertToOldLossType(loss: String): OldLoss = { + loss match { + case "squared" => OldSquaredError + case "absolute" => OldAbsoluteError + case _ => + // Should never happen because of check in setter method. + throw new RuntimeException(s"GBTRegressorParams was given bad loss type: $getLossType") + } + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala index 5905b7410..cf13e7349 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala @@ -18,7 +18,7 @@ object Entropy extends Impurity { return 0 } val numClasses = counts.length - var impurity = 0.0f + var impurity = 0.0 var classIndex = 0 while (classIndex < numClasses) { val classCount = counts(classIndex) @@ -28,7 +28,7 @@ object Entropy extends Impurity { } classIndex += 1 } - impurity + impurity.toFloat } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala index 041d232aa..97c8c3db9 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/AbsoluteError.scala @@ -21,7 +21,7 @@ object AbsoluteError extends Loss { if (label - prediction < 0) 1.0 else -1.0 } - override private[spark] def computeError(prediction: Double, label: Double): Double = { + override def computeError(prediction: Double, label: Double): Double = { val err = label - prediction math.abs(err) } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala index 10259d166..f1b01be9b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/LogLoss.scala @@ -24,7 +24,7 @@ object LogLoss extends ClassificationLoss { - 4.0 * label / (1.0 + math.exp(2.0 * label * prediction)) } - override private[spark] def computeError(prediction: Double, label: Double): Double = { + override def computeError(prediction: Double, label: Double): Double = { val margin = 2.0 * label * prediction // The following is equivalent to 2.0 * log(1 + exp(-margin)) but more numerically stable. if (-margin > 0) { @@ -32,13 +32,12 @@ object LogLoss extends ClassificationLoss { } else { 2 * math.log1p(math.exp(-margin)) } - 2.0 * MLUtils.log1pExp(-margin) } /** * Returns the estimated probability of a label of 1.0. */ - override private[spark] def computeProbability(margin: Double): Double = { + override def computeProbability(margin: Double): Double = { 1.0 / (1.0 + math.exp(-2.0 * margin)) } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala index 5ee95811b..e94be520c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala @@ -1,7 +1,8 @@ package com.tencent.angel.ml.tree.loss import com.tencent.angel.ml.feature.LabeledData -import org.apache.spark.mllib.tree.model.TreeEnsembleModel +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.model.TreeEnsembleModel /** * Trait for adding "pluggable" loss functions for the gradient boosting algorithm. @@ -27,7 +28,8 @@ trait Loss extends Serializable { * purposes. */ def computeError(model: TreeEnsembleModel, data: List[LabeledData]): Double = { - data.map(point => computeError(model.predict(point.getX), point.getY)).mean() + data.map(point => computeError(model.predict(point.getX.asInstanceOf[IntFloatVector]), point.getY)) + .reduce(_ + _) / data.length } /** @@ -40,13 +42,13 @@ trait Loss extends Serializable { * @note This method is used in the method evaluateEachIteration to avoid recomputing the * predicted values from previously fit trees. */ - private[mllib] def computeError(prediction: Double, label: Double): Double + def computeError(prediction: Double, label: Double): Double } -private[tree] trait ClassificationLoss extends Loss { +trait ClassificationLoss extends Loss { /** * Computes the class probability given the margin. */ - private[mllib] def computeProbability(margin: Double): Double + def computeProbability(margin: Double): Double } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala index ee2f3e85b..7900e38ca 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/SquaredError.scala @@ -21,7 +21,7 @@ object SquaredError extends Loss { - 2.0 * (label - prediction) } - override private[mllib] def computeError(prediction: Double, label: Double): Double = { + override def computeError(prediction: Double, label: Double): Double = { val err = label - prediction err * err } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala index 1eb1f6bdc..103623882 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala @@ -4,6 +4,9 @@ import java.text.DecimalFormat import scala.collection.mutable import scala.beans.BeanProperty + +import org.apache.hadoop.conf.Configuration + import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.model.MLModel @@ -12,7 +15,6 @@ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.{Algo, FeatureType} import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} import com.tencent.angel.worker.task.TaskContext -import org.apache.hadoop.conf.Configuration object DecisionTreeModel { @@ -24,15 +26,15 @@ object DecisionTreeModel { val SPLIT_GAIN_MAT: String = "gbdt.split.gain" val NODE_PRED_MAT: String = "gbdt.node.predict" - def apply(conf: Configuration) = { - new DecisionTreeModel(conf) + def apply(topNode: Node, algo: Algo, conf: Configuration) = { + new DecisionTreeModel(topNode, algo, conf) } - def apply(ctx: TaskContext, conf: Configuration) = { - new DecisionTreeModel(conf, ctx) + def apply(topNode: Node, algo: Algo, conf: Configuration, ctx: TaskContext) = { + new DecisionTreeModel(topNode, algo, conf, ctx) } - private[mllib] object DataStruct { + object DataStruct { case class PredictData(predict: Float, prob: Float) { def toPredict: Predict = new Predict(predict, prob) @@ -113,10 +115,10 @@ object DecisionTreeModel { (treeId, constructTree(data)) }.toList.sortBy(_._1) val numTrees = trees.length - val treeIndices = trees.map(_._1).toSeq + val treeIndices = trees.map(_._1) assert(treeIndices == (0 until numTrees), s"Tree indices must start from 0 and increment by 1, but we found $treeIndices.") - trees.map(_._2) + trees.map(_._2).toArray } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala new file mode 100644 index 000000000..352d623be --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala @@ -0,0 +1,463 @@ +package com.tencent.angel.ml.tree.model + +import scala.reflect.ClassTag + +import org.apache.hadoop.fs.Path +import org.json4s._ +import org.json4s.jackson.JsonMethods._ + +import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.ml.param.{Param, Params} +import org.apache.spark.ml.tree.DecisionTreeModelReadWrite.NodeData +import org.apache.spark.ml.util.{DefaultParamsReader, DefaultParamsWriter} +import org.apache.spark.ml.util.DefaultParamsReader.Metadata +import org.apache.spark.mllib.tree.impurity.ImpurityCalculator +import org.apache.spark.mllib.tree.model.{DecisionTreeModel => OldDecisionTreeModel} +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.{Dataset, SparkSession} +import org.apache.spark.util.collection.OpenHashMap + +/** + * Abstraction for Decision Tree models. + * + * TODO: Add support for predicting probabilities and raw predictions SPARK-3727 + */ +private[spark] trait DecisionTreeModel { + + /** Root of the decision tree */ + def rootNode: Node + + /** Number of nodes in tree, including leaf nodes. */ + def numNodes: Int = { + 1 + rootNode.numDescendants + } + + /** + * Depth of the tree. + * E.g.: Depth 0 means 1 leaf node. Depth 1 means 1 internal node and 2 leaf nodes. + */ + lazy val depth: Int = { + rootNode.subtreeDepth + } + + /** Summary of the model */ + override def toString: String = { + // Implementing classes should generally override this method to be more descriptive. + s"DecisionTreeModel of depth $depth with $numNodes nodes" + } + + /** Full description of model */ + def toDebugString: String = { + val header = toString + "\n" + header + rootNode.subtreeToString(2) + } + + /** + * Trace down the tree, and return the largest feature index used in any split. + * + * @return Max feature index used in a split, or -1 if there are no splits (single leaf node). + */ + private[ml] def maxSplitFeatureIndex(): Int = rootNode.maxSplitFeatureIndex() + + /** Convert to spark.mllib DecisionTreeModel (losing some information) */ + private[spark] def toOld: OldDecisionTreeModel +} + +/** + * Abstraction for models which are ensembles of decision trees + * + * TODO: Add support for predicting probabilities and raw predictions SPARK-3727 + * + * @tparam M Type of tree model in this ensemble + */ +private[ml] trait TreeEnsembleModel[M <: DecisionTreeModel] { + + // Note: We use getTrees since subclasses of TreeEnsembleModel will store subclasses of + // DecisionTreeModel. + + /** Trees in this ensemble. Warning: These have null parent Estimators. */ + def trees: Array[M] + + /** Weights for each tree, zippable with [[trees]] */ + def treeWeights: Array[Double] + + /** Weights used by the python wrappers. */ + // Note: An array cannot be returned directly due to serialization problems. + private[spark] def javaTreeWeights: Vector = Vectors.dense(treeWeights) + + /** Summary of the model */ + override def toString: String = { + // Implementing classes should generally override this method to be more descriptive. + s"TreeEnsembleModel with ${trees.length} trees" + } + + /** Full description of model */ + def toDebugString: String = { + val header = toString + "\n" + header + trees.zip(treeWeights).zipWithIndex.map { case ((tree, weight), treeIndex) => + s" Tree $treeIndex (weight $weight):\n" + tree.rootNode.subtreeToString(4) + }.fold("")(_ + _) + } + + /** Total number of nodes, summed over all trees in the ensemble. */ + lazy val totalNumNodes: Int = trees.map(_.numNodes).sum +} + +private[ml] object TreeEnsembleModel { + + /** + * Given a tree ensemble model, compute the importance of each feature. + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * For collections of trees, including boosting and bagging, Hastie et al. + * propose to use the average of single tree importances across all trees in the ensemble. + * + * This feature importance is calculated as follows: + * - Average over trees: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * - Normalize feature importance vector to sum to 1. + * + * References: + * - Hastie, Tibshirani, Friedman. "The Elements of Statistical Learning, 2nd Edition." 2001. + * + * @param trees Unweighted collection of trees + * @param numFeatures Number of features in model (even if not all are explicitly used by + * the model). + * If -1, then numFeatures is set based on the max feature index in all trees. + * @return Feature importance values, of length numFeatures. + */ + def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): Vector = { + val totalImportances = new OpenHashMap[Int, Double]() + trees.foreach { tree => + // Aggregate feature importance vector for this tree + val importances = new OpenHashMap[Int, Double]() + computeFeatureImportance(tree.rootNode, importances) + // Normalize importance vector for this tree, and add it to total. + // TODO: In the future, also support normalizing by tree.rootNode.impurityStats.count? + val treeNorm = importances.map(_._2).sum + if (treeNorm != 0) { + importances.foreach { case (idx, impt) => + val normImpt = impt / treeNorm + totalImportances.changeValue(idx, normImpt, _ + normImpt) + } + } + } + // Normalize importances + normalizeMapValues(totalImportances) + // Construct vector + val d = if (numFeatures != -1) { + numFeatures + } else { + // Find max feature index used in trees + val maxFeatureIndex = trees.map(_.maxSplitFeatureIndex()).max + maxFeatureIndex + 1 + } + if (d == 0) { + assert(totalImportances.size == 0, s"Unknown error in computing feature" + + s" importance: No splits found, but some non-zero importances.") + } + val (indices, values) = totalImportances.iterator.toSeq.sortBy(_._1).unzip + Vectors.sparse(d, indices.toArray, values.toArray) + } + + /** + * Given a Decision Tree model, compute the importance of each feature. + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * This feature importance is calculated as follows: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * + * @param tree Decision tree to compute importances for. + * @param numFeatures Number of features in model (even if not all are explicitly used by + * the model). + * If -1, then numFeatures is set based on the max feature index in all trees. + * @return Feature importance values, of length numFeatures. + */ + def featureImportances[M <: DecisionTreeModel : ClassTag](tree: M, numFeatures: Int): Vector = { + featureImportances(Array(tree), numFeatures) + } + + /** + * Recursive method for computing feature importances for one tree. + * This walks down the tree, adding to the importance of 1 feature at each node. + * + * @param node Current node in recursion + * @param importances Aggregate feature importances, modified by this method + */ + def computeFeatureImportance( + node: Node, + importances: OpenHashMap[Int, Double]): Unit = { + node match { + case n: InternalNode => + val feature = n.split.featureIndex + val scaledGain = n.gain * n.impurityStats.count + importances.changeValue(feature, scaledGain, _ + scaledGain) + computeFeatureImportance(n.leftChild, importances) + computeFeatureImportance(n.rightChild, importances) + case n: LeafNode => + // do nothing + } + } + + /** + * Normalize the values of this map to sum to 1, in place. + * If all values are 0, this method does nothing. + * + * @param map Map with non-negative values. + */ + def normalizeMapValues(map: OpenHashMap[Int, Double]): Unit = { + val total = map.map(_._2).sum + if (total != 0) { + val keys = map.iterator.map(_._1).toArray + keys.foreach { key => map.changeValue(key, 0.0, _ / total) } + } + } +} + +/** Helper classes for tree model persistence */ +private[ml] object DecisionTreeModelReadWrite { + + /** + * Info for a [[org.apache.spark.ml.tree.Split]] + * + * @param featureIndex Index of feature split on + * @param leftCategoriesOrThreshold For categorical feature, set of leftCategories. + * For continuous feature, threshold. + * @param numCategories For categorical feature, number of categories. + * For continuous feature, -1. + */ + case class SplitData( + featureIndex: Int, + leftCategoriesOrThreshold: Array[Double], + numCategories: Int) { + + def getSplit: Split = { + if (numCategories != -1) { + new CategoricalSplit(featureIndex, leftCategoriesOrThreshold, numCategories) + } else { + assert(leftCategoriesOrThreshold.length == 1, s"DecisionTree split data expected" + + s" 1 threshold for ContinuousSplit, but found thresholds: " + + leftCategoriesOrThreshold.mkString(", ")) + new ContinuousSplit(featureIndex, leftCategoriesOrThreshold(0)) + } + } + } + + object SplitData { + def apply(split: Split): SplitData = split match { + case s: CategoricalSplit => + SplitData(s.featureIndex, s.leftCategories, s.numCategories) + case s: ContinuousSplit => + SplitData(s.featureIndex, Array(s.threshold), -1) + } + } + + /** + * Info for a [[Node]] + * + * @param id Index used for tree reconstruction. Indices follow a pre-order traversal. + * @param impurityStats Stats array. Impurity type is stored in metadata. + * @param gain Gain, or arbitrary value if leaf node. + * @param leftChild Left child index, or arbitrary value if leaf node. + * @param rightChild Right child index, or arbitrary value if leaf node. + * @param split Split info, or arbitrary value if leaf node. + */ + case class NodeData( + id: Int, + prediction: Double, + impurity: Double, + impurityStats: Array[Double], + gain: Double, + leftChild: Int, + rightChild: Int, + split: SplitData) + + object NodeData { + /** + * Create [[NodeData]] instances for this node and all children. + * + * @param id Current ID. IDs are assigned via a pre-order traversal. + * @return (sequence of nodes in pre-order traversal order, largest ID in subtree) + * The nodes are returned in pre-order traversal (root first) so that it is easy to + * get the ID of the subtree's root node. + */ + def build(node: Node, id: Int): (Seq[NodeData], Int) = node match { + case n: InternalNode => + val (leftNodeData, leftIdx) = build(n.leftChild, id + 1) + val (rightNodeData, rightIdx) = build(n.rightChild, leftIdx + 1) + val thisNodeData = NodeData(id, n.prediction, n.impurity, n.impurityStats.stats, + n.gain, leftNodeData.head.id, rightNodeData.head.id, SplitData(n.split)) + (thisNodeData +: (leftNodeData ++ rightNodeData), rightIdx) + case _: LeafNode => + (Seq(NodeData(id, node.prediction, node.impurity, node.impurityStats.stats, + -1.0, -1, -1, SplitData(-1, Array.empty[Double], -1))), + id) + } + } + + /** + * Load a decision tree from a file. + * @return Root node of reconstructed tree + */ + def loadTreeNodes( + path: String, + metadata: DefaultParamsReader.Metadata, + sparkSession: SparkSession): Node = { + import sparkSession.implicits._ + implicit val format = DefaultFormats + + // Get impurity to construct ImpurityCalculator for each node + val impurityType: String = { + val impurityJson: JValue = metadata.getParamValue("impurity") + Param.jsonDecode[String](compact(render(impurityJson))) + } + + val dataPath = new Path(path, "data").toString + val data = sparkSession.read.parquet(dataPath).as[NodeData] + buildTreeFromNodes(data.collect(), impurityType) + } + + /** + * Given all data for all nodes in a tree, rebuild the tree. + * @param data Unsorted node data + * @param impurityType Impurity type for this tree + * @return Root node of reconstructed tree + */ + def buildTreeFromNodes(data: Array[NodeData], impurityType: String): Node = { + // Load all nodes, sorted by ID. + val nodes = data.sortBy(_.id) + // Sanity checks; could remove + assert(nodes.head.id == 0, s"Decision Tree load failed. Expected smallest node ID to be 0," + + s" but found ${nodes.head.id}") + assert(nodes.last.id == nodes.length - 1, s"Decision Tree load failed. Expected largest" + + s" node ID to be ${nodes.length - 1}, but found ${nodes.last.id}") + // We fill `finalNodes` in reverse order. Since node IDs are assigned via a pre-order + // traversal, this guarantees that child nodes will be built before parent nodes. + val finalNodes = new Array[Node](nodes.length) + nodes.reverseIterator.foreach { case n: NodeData => + val impurityStats = ImpurityCalculator.getCalculator(impurityType, n.impurityStats) + val node = if (n.leftChild != -1) { + val leftChild = finalNodes(n.leftChild) + val rightChild = finalNodes(n.rightChild) + new InternalNode(n.prediction, n.impurity, n.gain, leftChild, rightChild, + n.split.getSplit, impurityStats) + } else { + new LeafNode(n.prediction, n.impurity, impurityStats) + } + finalNodes(n.id) = node + } + // Return the root node + finalNodes.head + } +} + +private[ml] object EnsembleModelReadWrite { + + /** + * Helper method for saving a tree ensemble to disk. + * + * @param instance Tree ensemble model + * @param path Path to which to save the ensemble model. + * @param extraMetadata Metadata such as numFeatures, numClasses, numTrees. + */ + def saveImpl[M <: Params with TreeEnsembleModel[_ <: DecisionTreeModel]]( + instance: M, + path: String, + sql: SparkSession, + extraMetadata: JObject): Unit = { + DefaultParamsWriter.saveMetadata(instance, path, sql.sparkContext, Some(extraMetadata)) + val treesMetadataWeights: Array[(Int, String, Double)] = instance.trees.zipWithIndex.map { + case (tree, treeID) => + (treeID, + DefaultParamsWriter.getMetadataToSave(tree.asInstanceOf[Params], sql.sparkContext), + instance.treeWeights(treeID)) + } + val treesMetadataPath = new Path(path, "treesMetadata").toString + sql.createDataFrame(treesMetadataWeights).toDF("treeID", "metadata", "weights") + .write.parquet(treesMetadataPath) + val dataPath = new Path(path, "data").toString + val nodeDataRDD = sql.sparkContext.parallelize(instance.trees.zipWithIndex).flatMap { + case (tree, treeID) => EnsembleNodeData.build(tree, treeID) + } + sql.createDataFrame(nodeDataRDD).write.parquet(dataPath) + } + + /** + * Helper method for loading a tree ensemble from disk. + * This reconstructs all trees, returning the root nodes. + * @param path Path given to `saveImpl` + * @param className Class name for ensemble model type + * @param treeClassName Class name for tree model type in the ensemble + * @return (ensemble metadata, array over trees of (tree metadata, root node)), + * where the root node is linked with all descendents + * @see `saveImpl` for how the model was saved + */ + def loadImpl( + path: String, + sql: SparkSession, + className: String, + treeClassName: String): (Metadata, Array[(Metadata, Node)], Array[Double]) = { + import sql.implicits._ + implicit val format = DefaultFormats + val metadata = DefaultParamsReader.loadMetadata(path, sql.sparkContext, className) + + // Get impurity to construct ImpurityCalculator for each node + val impurityType: String = { + val impurityJson: JValue = metadata.getParamValue("impurity") + Param.jsonDecode[String](compact(render(impurityJson))) + } + + val treesMetadataPath = new Path(path, "treesMetadata").toString + val treesMetadataRDD: RDD[(Int, (Metadata, Double))] = sql.read.parquet(treesMetadataPath) + .select("treeID", "metadata", "weights").as[(Int, String, Double)].rdd.map { + case (treeID: Int, json: String, weights: Double) => + treeID -> ((DefaultParamsReader.parseMetadata(json, treeClassName), weights)) + } + + val treesMetadataWeights = treesMetadataRDD.sortByKey().values.collect() + val treesMetadata = treesMetadataWeights.map(_._1) + val treesWeights = treesMetadataWeights.map(_._2) + + val dataPath = new Path(path, "data").toString + val nodeData: Dataset[EnsembleNodeData] = + sql.read.parquet(dataPath).as[EnsembleNodeData] + val rootNodesRDD: RDD[(Int, Node)] = + nodeData.rdd.map(d => (d.treeID, d.nodeData)).groupByKey().map { + case (treeID: Int, nodeData: Iterable[NodeData]) => + treeID -> DecisionTreeModelReadWrite.buildTreeFromNodes(nodeData.toArray, impurityType) + } + val rootNodes: Array[Node] = rootNodesRDD.sortByKey().values.collect() + (metadata, treesMetadata.zip(rootNodes), treesWeights) + } + + /** + * Info for one [[Node]] in a tree ensemble + * + * @param treeID Tree index + * @param nodeData Data for this node + */ + case class EnsembleNodeData( + treeID: Int, + nodeData: NodeData) + + object EnsembleNodeData { + /** + * Create [[EnsembleNodeData]] instances for the given tree. + * + * @return Sequence of nodes for this tree + */ + def build(tree: DecisionTreeModel, treeID: Int): Seq[EnsembleNodeData] = { + val (nodeData: Seq[NodeData], _) = NodeData.build(tree.rootNode, 0) + nodeData.map(nd => EnsembleNodeData(treeID, nd)) + } + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala index d183318b7..61ce77331 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala @@ -62,7 +62,7 @@ class Node ( /** * Returns a deep copy of the subtree rooted at this node. */ - private[mllib] def deepCopy(): Node = { + def deepCopy(): Node = { val leftNodeCopy = if (leftNode.isEmpty) { None } else { @@ -80,7 +80,7 @@ class Node ( * Get the number of nodes in tree below this node, including leaf nodes. * E.g., if this is a leaf, returns 0. If both children are leaves, returns 2. */ - private[mllib] def numDescendants: Int = if (isLeaf) { + def numDescendants: Int = if (isLeaf) { 0 } else { 2 + leftNode.get.numDescendants + rightNode.get.numDescendants @@ -90,7 +90,7 @@ class Node ( * Get depth of tree from this node. * E.g.: Depth 0 means this is a leaf node. */ - private[mllib] def subtreeDepth: Int = if (isLeaf) { + def subtreeDepth: Int = if (isLeaf) { 0 } else { 1 + math.max(leftNode.get.subtreeDepth, rightNode.get.subtreeDepth) @@ -100,7 +100,7 @@ class Node ( * Recursive print function. * @param indentFactor The number of spaces to add to each level of indentation. */ - private[mllib] def subtreeToString(indentFactor: Int = 0): String = { + def subtreeToString(indentFactor: Int = 0): String = { def splitToString(split: Split, left: Boolean): String = { split.featureType match { @@ -128,13 +128,13 @@ class Node ( } /** Returns an iterator that traverses (DFS, left to right) the subtree of this node. */ - private[mllib] def subtreeIterator: Iterator[Node] = { + def subtreeIterator: Iterator[Node] = { Iterator.single(this) ++ leftNode.map(_.subtreeIterator).getOrElse(Iterator.empty) ++ rightNode.map(_.subtreeIterator).getOrElse(Iterator.empty) } } -private[tree] object Node { +object Node { /** * Return a node with the given node id (but nothing else set). diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala index 9541b3bbd..1bd6cf23e 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala @@ -1,14 +1,13 @@ package com.tencent.angel.ml.tree.model -import com.tencent.angel.ml.auto.config.Configuration -import com.tencent.angel.ml.feature.LabeledData - import scala.collection.mutable -import com.tencent.angel.ml.math2.VFactory + +import org.apache.hadoop.conf.Configuration + import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.model.MLModel import com.tencent.angel.ml.predict.PredictResult -import com.tencent.angel.ml.tree.conf.Algo +import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy._ import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} @@ -22,9 +21,10 @@ import com.tencent.angel.worker.task.TaskContext */ class RandomForestModel ( override val algo: Algo, - override val trees: Array[DecisionTreeModel]) + override val trees: Array[DecisionTreeModel], + conf: Configuration, _ctx: TaskContext = null) extends TreeEnsembleModel(algo, trees, Array.fill(trees.length)(1.0), - combiningStrategy = if (algo == Classification) Vote else Average) { + combiningStrategy = if (algo == Classification) Vote else Average, conf, _ctx) { require(trees.forall(_.algo == algo)) } @@ -37,7 +37,7 @@ class RandomForestModel ( * @param treeWeights tree ensemble weights * @param combiningStrategy strategy for combining the predictions, not used for regression. */ -private[tree] sealed class TreeEnsembleModel( +sealed class TreeEnsembleModel( protected val algo: Algo, protected val trees: Array[DecisionTreeModel], protected val treeWeights: Array[Double], @@ -66,8 +66,6 @@ private[tree] sealed class TreeEnsembleModel( ret } - - /** * Predicts for a single data point using the weighted sum of ensemble predictions. * @@ -126,7 +124,7 @@ private[tree] sealed class TreeEnsembleModel( def predict(features: List[IntFloatVector]): List[Double] = features.map(x => predict(x)) def predict(features: Array[IntFloatVector]): Array[Double] = { - predict(features.toList) + predict(features.toList).toArray } /** @@ -164,7 +162,7 @@ private[tree] sealed class TreeEnsembleModel( def totalNumNodes: Int = trees.map(_.numNodes).sum } -private[tree] object TreeEnsembleModel { +object TreeEnsembleModel { object SaveUtils { From 004a56ff0a0894a15e844162b45ed3977f04644c Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 15 Nov 2018 18:08:26 +0800 Subject: [PATCH 004/115] compile clean version --- .../angel/ml/tree/DecisionTreeLearner.scala | 75 +- .../com/tencent/angel/ml/tree/RFModel.scala | 5 - .../angel/ml/tree/RandomForestLearner.scala | 140 +-- .../NewTreeModels.scala => TreeModels.scala} | 184 +-- .../angel/ml/tree/{conf => }/TreeParams.scala | 80 +- .../tencent/angel/ml/tree/conf/Strategy.scala | 17 +- .../angel/ml/tree/impurity/Entropy.scala | 4 +- .../tencent/angel/ml/tree/impurity/Gini.scala | 4 +- .../angel/ml/tree/impurity/Impurities.scala | 2 +- .../angel/ml/tree/impurity/Impurity.scala | 4 +- .../angel/ml/tree/impurity/Variance.scala | 4 +- .../com/tencent/angel/ml/tree/loss/Loss.scala | 4 +- .../angel/ml/tree/model/BaggedPoint.scala | 107 ++ .../ml/tree/model/DTStatsAggregator.scala | 163 +++ .../DecisionTreeClassificationModel.scala | 85 ++ .../ml/tree/model/DecisionTreeMetadata.scala | 218 ++++ .../model/DecisionTreeRegressionModel.scala | 77 ++ .../tencent/angel/ml/tree/model/Node.scala | 413 +++++-- .../angel/ml/tree/model/NodeIdCache.scala | 90 ++ .../ProbabilisticClassificationModel.scala | 32 + .../angel/ml/tree/model/RandomForest.scala | 1087 +++++++++++++++++ .../tencent/angel/ml/tree/model/Split.scala | 190 ++- .../angel/ml/tree/model/TreePoint.scala | 120 ++ .../DecisionTreeModel.scala | 14 +- .../InformationGainStats.scala | 2 +- .../tencent/angel/ml/tree/oldmodel/Node.scala | 225 ++++ .../ml/tree/{model => oldmodel}/Predict.scala | 2 +- .../angel/ml/tree/oldmodel/Split.scala | 49 + .../TreeEnsembleModels.scala | 22 +- .../angel/ml/tree/utils/SamplingUtils.scala | 151 +++ .../angel/ml/tree/utils/TimeTracker.scala | 53 + .../angel/ml/tree/utils/XORShiftRandom.scala | 51 + 32 files changed, 3203 insertions(+), 471 deletions(-) delete mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model/NewTreeModels.scala => TreeModels.scala} (63%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{conf => }/TreeParams.scala (92%) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => oldmodel}/DecisionTreeModel.scala (95%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => oldmodel}/InformationGainStats.scala (98%) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => oldmodel}/Predict.scala (93%) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Split.scala rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => oldmodel}/TreeEnsembleModels.scala (89%) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/SamplingUtils.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/TimeTracker.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/XORShiftRandom.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala index 2f53e49b0..6a1dfdd89 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ import com.tencent.angel.ml.tree.conf.{Algo, Strategy} import com.tencent.angel.ml.tree.impurity._ -import com.tencent.angel.ml.tree.model._ +import com.tencent.angel.ml.tree.oldmodel._ import com.tencent.angel.worker.storage.DataBlock import com.tencent.angel.worker.task.TaskContext @@ -35,14 +35,14 @@ class DecisionTreeLearner (ctx: TaskContext, val strategy: Strategy, val seed: I /** * Method to train a decision tree model over an RDD * - * @param trainData : trainning data storage - * @param validationData : validation data storage + * @param trainBlock : trainning data storage + * @param validBlock : validation data storage */ override - def train(trainData: DataBlock[LabeledData], validationData: DataBlock[LabeledData]): MLModel = { - val rf = new RandomForestLearner(strategy, numTrees = 1, featureSubsetStrategy = "all", seed = seed) - val rfModel = rf.run(input) - rfModel.trees(0) + def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { + val rf = new RandomForestLearner(ctx, strategy, numTrees = 1, featureSubsetStrategy = "all", seed = seed) + val rfModel = rf.train(trainBlock, validBlock) + rfModel.asInstanceOf[RandomForestModel].trees(0) } } @@ -52,7 +52,7 @@ object DecisionTree { * Method to train a decision tree model. * The method supports binary and multiclass classification and regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * For classification, labels should take values {0, 1, ..., numClasses-1}. * For regression, labels are real numbers. * @param strategy The configuration parameters for the tree algorithm which specify the type @@ -64,15 +64,19 @@ object DecisionTree { * and `org.apache.spark.mllib.tree.DecisionTree.trainRegressor` * is recommended to clearly separate classification and regression. */ - def train(input: RDD[LabeledPoint], strategy: Strategy): DecisionTreeModel = { - new DecisionTree(strategy).run(input) + def train( + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], + strategy: Strategy): MLModel = { + new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } /** * Method to train a decision tree model. * The method supports binary and multiclass classification and regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * For classification, labels should take values {0, 1, ..., numClasses-1}. * For regression, labels are real numbers. * @param algo Type of decision tree, either classification or regression. @@ -86,19 +90,21 @@ object DecisionTree { * is recommended to clearly separate classification and regression. */ def train( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], algo: Algo, impurity: Impurity, - maxDepth: Int): DecisionTreeModel = { + maxDepth: Int): MLModel = { val strategy = new Strategy(algo, impurity, maxDepth) - new DecisionTree(strategy).run(input) + new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } /** * Method to train a decision tree model. * The method supports binary and multiclass classification and regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * For classification, labels should take values {0, 1, ..., numClasses-1}. * For regression, labels are real numbers. * @param algo Type of decision tree, either classification or regression. @@ -113,20 +119,22 @@ object DecisionTree { * is recommended to clearly separate classification and regression. */ def train( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], algo: Algo, impurity: Impurity, maxDepth: Int, - numClasses: Int): DecisionTreeModel = { + numClasses: Int): MLModel = { val strategy = new Strategy(algo, impurity, maxDepth, numClasses) - new DecisionTree(strategy).run(input) + new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } /** * Method to train a decision tree model. * The method supports binary and multiclass classification and regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * For classification, labels should take values {0, 1, ..., numClasses-1}. * For regression, labels are real numbers. * @param algo Type of decision tree, either classification or regression. @@ -146,23 +154,25 @@ object DecisionTree { * is recommended to clearly separate classification and regression. */ def train( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], algo: Algo, impurity: Impurity, maxDepth: Int, numClasses: Int, maxBins: Int, quantileCalculationStrategy: QuantileStrategy, - categoricalFeaturesInfo: Map[Int, Int]): DecisionTreeModel = { + categoricalFeaturesInfo: Map[Int, Int]): MLModel = { val strategy = new Strategy(algo, impurity, maxDepth, numClasses, maxBins, quantileCalculationStrategy, categoricalFeaturesInfo) - new DecisionTree(strategy).run(input) + new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } /** * Method to train a decision tree model for binary or multiclass classification. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels should take values {0, 1, ..., numClasses-1}. * @param numClasses Number of classes for classification. * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) @@ -178,21 +188,23 @@ object DecisionTree { * @return DecisionTreeModel that can be used for prediction. */ def trainClassifier( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], numClasses: Int, categoricalFeaturesInfo: Map[Int, Int], impurity: String, maxDepth: Int, - maxBins: Int): DecisionTreeModel = { + maxBins: Int): MLModel = { val impurityType = Impurities.fromString(impurity) - train(input, Classification, impurityType, maxDepth, numClasses, maxBins, Sort, + train(ctx, trainBlock, validBlock, Classification, impurityType, maxDepth, numClasses, maxBins, Sort, categoricalFeaturesInfo) } /** * Method to train a decision tree model for regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels are real numbers. * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) * indicates that feature n is categorical with k categories @@ -207,13 +219,16 @@ object DecisionTree { * @return DecisionTreeModel that can be used for prediction. */ def trainRegressor( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], categoricalFeaturesInfo: Map[Int, Int], impurity: String, maxDepth: Int, - maxBins: Int): DecisionTreeModel = { + maxBins: Int): MLModel = { val impurityType = Impurities.fromString(impurity) - train(input, Regression, impurityType, maxDepth, 0, maxBins, Sort, categoricalFeaturesInfo) + train(ctx, trainBlock, validBlock, Regression, impurityType, maxDepth, + 0, maxBins, Sort, categoricalFeaturesInfo) } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala deleted file mode 100644 index 27547b6c7..000000000 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RFModel.scala +++ /dev/null @@ -1,5 +0,0 @@ -package com.tencent.angel.ml.tree - -object RFModel { - -} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index 3031a8559..052a694a7 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -5,17 +5,19 @@ import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel import scala.util.Try - -import org.apache.spark.ml.tree.{DecisionTreeModel => NewDTModel, TreeEnsembleParams => NewRFParams} -import org.apache.spark.ml.tree.impl.{RandomForest => NewRandomForest} +import scala.util.Random +import com.tencent.angel.ml.tree.{TreeEnsembleParams => NewRFParams} +import com.tencent.angel.ml.tree.model.{RandomForest => NewRandomForest} import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ import com.tencent.angel.ml.tree.conf.Strategy import com.tencent.angel.ml.tree.impurity.Impurities -import com.tencent.angel.ml.tree.model._ +import com.tencent.angel.ml.tree.oldmodel._ import com.tencent.angel.worker.storage.DataBlock import com.tencent.angel.worker.task.TaskContext +import scala.collection.mutable.ArrayBuffer + /** * A class that implements a Random Forest * learning algorithm for classification and regression. @@ -49,44 +51,55 @@ import com.tencent.angel.worker.task.TaskContext * use n features. * @param seed Random seed for bootstrapping and choosing feature subsets. */ -class RandomForest ( - val ctx: TaskContext, - val strategy: Strategy, - val numTrees: Int, - featureSubsetStrategy: String, - val seed: Int) +class RandomForestLearner ( + override val ctx: TaskContext, + val strategy: Strategy, + val numTrees: Int, + featureSubsetStrategy: String, + val seed: Int) extends MLLearner(ctx) { strategy.assertValid() require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") - require(RandomForest.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) + require(RandomForestLearner.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) || Try(featureSubsetStrategy.toInt).filter(_ > 0).isSuccess || Try(featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, s"RandomForest given invalid featureSubsetStrategy: $featureSubsetStrategy." + s" Supported values: ${NewRFParams.supportedFeatureSubsetStrategies.mkString(", ")}," + s" (0.0-1.0], [1-n].") + private[tree] def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { + input.resetReadIndex() + val ret = new ArrayBuffer[LabeledData] + (0 until input.size()).foreach{ + ret += input.read() + } + ret.toArray + } + /** * Method to train a decision tree model over an RDD * - * @param input Training data: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training data: DataBlock of [[org.apache.spark.mllib.regression.LabeledPoint]]. * @return RandomForestModel that can be used for prediction. */ override - def train(trainData: DataBlock[LabeledData], validationData: DataBlock[LabeledData]): MLModel = { - val trees: Array[NewDTModel] = NewRandomForest.run(input.map(_.asML), strategy, numTrees, - featureSubsetStrategy, seed.toLong, None) - new RandomForestModel(strategy.algo, trees.map(_.toOld)) + def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { + var trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) + var validDataSet: Array[LabeledData] = convertDataBlock(validBlock) + val trees: Array[DecisionTreeModel] = NewRandomForest.train(trainDataSet, validDataSet, strategy, numTrees, + featureSubsetStrategy, seed.toLong) + new RandomForestModel(strategy.algo, trees.map(_.toOld), ctx.getConf, ctx) } } -object RandomForest { +object RandomForestLearner { /** * Method to train a decision tree model for binary or multiclass classification. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels should take values {0, 1, ..., numClasses-1}. * @param strategy Parameters for training each tree in the forest. * @param numTrees Number of trees in the random forest. @@ -96,24 +109,26 @@ object RandomForest { * if numTrees == 1, set to "all"; * if numTrees is greater than 1 (forest) set to "sqrt". * @param seed Random seed for bootstrapping and choosing feature subsets. - * @return RandomForestModel that can be used for prediction. + * @return MLModel that can be used for prediction. */ def trainClassifier( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], strategy: Strategy, numTrees: Int, featureSubsetStrategy: String, - seed: Int): RandomForestModel = { + seed: Int): MLModel = { require(strategy.algo == Classification, s"RandomForest.trainClassifier given Strategy with invalid algo: ${strategy.algo}") - val rf = new RandomForest(strategy, numTrees, featureSubsetStrategy, seed) - rf.run(input) + val rf = new RandomForestLearner(ctx, strategy, numTrees, featureSubsetStrategy, seed) + rf.train(trainBlock, validBlock) } /** * Method to train a decision tree model for binary or multiclass classification. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels should take values {0, 1, ..., numClasses-1}. * @param numClasses Number of classes for classification. * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) @@ -133,11 +148,12 @@ object RandomForest { * @param maxBins Maximum number of bins used for splitting features * (suggested value: 100) * @param seed Random seed for bootstrapping and choosing feature subsets. - * @return RandomForestModel that can be used for prediction. + * @return MLModel that can be used for prediction. */ - @Since("1.2.0") def trainClassifier( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], numClasses: Int, categoricalFeaturesInfo: Map[Int, Int], numTrees: Int, @@ -145,36 +161,17 @@ object RandomForest { impurity: String, maxDepth: Int, maxBins: Int, - seed: Int = Utils.random.nextInt()): RandomForestModel = { + seed: Int = Random.nextInt()): MLModel = { val impurityType = Impurities.fromString(impurity) val strategy = new Strategy(Classification, impurityType, maxDepth, numClasses, maxBins, Sort, categoricalFeaturesInfo) - trainClassifier(input, strategy, numTrees, featureSubsetStrategy, seed) - } - - /** - * Java-friendly API for `org.apache.spark.mllib.tree.RandomForest.trainClassifier` - */ - @Since("1.2.0") - def trainClassifier( - input: JavaRDD[LabeledPoint], - numClasses: Int, - categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer], - numTrees: Int, - featureSubsetStrategy: String, - impurity: String, - maxDepth: Int, - maxBins: Int, - seed: Int): RandomForestModel = { - trainClassifier(input.rdd, numClasses, - categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap, - numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed) + trainClassifier(ctx, trainBlock, validBlock, strategy, numTrees, featureSubsetStrategy, seed) } /** * Method to train a decision tree model for regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels are real numbers. * @param strategy Parameters for training each tree in the forest. * @param numTrees Number of trees in the random forest. @@ -184,25 +181,26 @@ object RandomForest { * if numTrees == 1, set to "all"; * if numTrees is greater than 1 (forest) set to "onethird". * @param seed Random seed for bootstrapping and choosing feature subsets. - * @return RandomForestModel that can be used for prediction. + * @return MLModel that can be used for prediction. */ - @Since("1.2.0") def trainRegressor( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], strategy: Strategy, numTrees: Int, featureSubsetStrategy: String, - seed: Int): RandomForestModel = { + seed: Int): MLModel = { require(strategy.algo == Regression, s"RandomForest.trainRegressor given Strategy with invalid algo: ${strategy.algo}") - val rf = new RandomForest(strategy, numTrees, featureSubsetStrategy, seed) - rf.run(input) + val rf = new RandomForestLearner(ctx, strategy, numTrees, featureSubsetStrategy, seed) + rf.train(trainBlock, validBlock) } /** * Method to train a decision tree model for regression. * - * @param input Training dataset: RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]. + * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels are real numbers. * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) * indicates that feature n is categorical with k categories @@ -221,46 +219,28 @@ object RandomForest { * @param maxBins Maximum number of bins used for splitting features. * (suggested value: 100) * @param seed Random seed for bootstrapping and choosing feature subsets. - * @return RandomForestModel that can be used for prediction. + * @return MLModel that can be used for prediction. */ - @Since("1.2.0") def trainRegressor( - input: RDD[LabeledPoint], + ctx: TaskContext, + trainBlock: DataBlock[LabeledData], + validBlock: DataBlock[LabeledData], categoricalFeaturesInfo: Map[Int, Int], numTrees: Int, featureSubsetStrategy: String, impurity: String, maxDepth: Int, maxBins: Int, - seed: Int = Utils.random.nextInt()): RandomForestModel = { + seed: Int = Random.nextInt()): MLModel = { val impurityType = Impurities.fromString(impurity) val strategy = new Strategy(Regression, impurityType, maxDepth, 0, maxBins, Sort, categoricalFeaturesInfo) - trainRegressor(input, strategy, numTrees, featureSubsetStrategy, seed) - } - - /** - * Java-friendly API for `org.apache.spark.mllib.tree.RandomForest.trainRegressor` - */ - @Since("1.2.0") - def trainRegressor( - input: JavaRDD[LabeledPoint], - categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer], - numTrees: Int, - featureSubsetStrategy: String, - impurity: String, - maxDepth: Int, - maxBins: Int, - seed: Int): RandomForestModel = { - trainRegressor(input.rdd, - categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap, - numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed) + trainRegressor(ctx, trainBlock, validBlock, strategy, numTrees, featureSubsetStrategy, seed) } /** * List of supported feature subset sampling strategies. */ - @Since("1.2.0") val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala similarity index 63% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala index 352d623be..e48bcb7d5 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NewTreeModels.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala @@ -1,28 +1,21 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree -import scala.reflect.ClassTag +import com.tencent.angel.ml.math2.VFactory +import com.tencent.angel.ml.math2.vector.{IntDoubleVector, IntFloatVector} +import com.tencent.angel.ml.tree.DecisionTreeModelReadWrite.NodeData +import com.tencent.angel.ml.tree.model._ +import com.tencent.angel.ml.tree.impurity.ImpurityCalculator +import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} -import org.apache.hadoop.fs.Path -import org.json4s._ -import org.json4s.jackson.JsonMethods._ - -import org.apache.spark.ml.linalg.{Vector, Vectors} -import org.apache.spark.ml.param.{Param, Params} -import org.apache.spark.ml.tree.DecisionTreeModelReadWrite.NodeData -import org.apache.spark.ml.util.{DefaultParamsReader, DefaultParamsWriter} -import org.apache.spark.ml.util.DefaultParamsReader.Metadata -import org.apache.spark.mllib.tree.impurity.ImpurityCalculator -import org.apache.spark.mllib.tree.model.{DecisionTreeModel => OldDecisionTreeModel} -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.{Dataset, SparkSession} -import org.apache.spark.util.collection.OpenHashMap +import scala.collection.mutable +import scala.reflect.ClassTag /** * Abstraction for Decision Tree models. * * TODO: Add support for predicting probabilities and raw predictions SPARK-3727 */ -private[spark] trait DecisionTreeModel { +trait DecisionTreeModel { /** Root of the decision tree */ def rootNode: Node @@ -57,10 +50,10 @@ private[spark] trait DecisionTreeModel { * * @return Max feature index used in a split, or -1 if there are no splits (single leaf node). */ - private[ml] def maxSplitFeatureIndex(): Int = rootNode.maxSplitFeatureIndex() + def maxSplitFeatureIndex(): Int = rootNode.maxSplitFeatureIndex() /** Convert to spark.mllib DecisionTreeModel (losing some information) */ - private[spark] def toOld: OldDecisionTreeModel + private[tree] def toOld: OldDecisionTreeModel } /** @@ -70,7 +63,7 @@ private[spark] trait DecisionTreeModel { * * @tparam M Type of tree model in this ensemble */ -private[ml] trait TreeEnsembleModel[M <: DecisionTreeModel] { +private[tree] trait TreeEnsembleModel[M <: DecisionTreeModel] { // Note: We use getTrees since subclasses of TreeEnsembleModel will store subclasses of // DecisionTreeModel. @@ -81,9 +74,7 @@ private[ml] trait TreeEnsembleModel[M <: DecisionTreeModel] { /** Weights for each tree, zippable with [[trees]] */ def treeWeights: Array[Double] - /** Weights used by the python wrappers. */ - // Note: An array cannot be returned directly due to serialization problems. - private[spark] def javaTreeWeights: Vector = Vectors.dense(treeWeights) + private[tree] def javaTreeWeights: IntDoubleVector = VFactory.denseDoubleVector(treeWeights) /** Summary of the model */ override def toString: String = { @@ -103,7 +94,7 @@ private[ml] trait TreeEnsembleModel[M <: DecisionTreeModel] { lazy val totalNumNodes: Int = trees.map(_.numNodes).sum } -private[ml] object TreeEnsembleModel { +private[tree] object TreeEnsembleModel { /** * Given a tree ensemble model, compute the importance of each feature. @@ -130,19 +121,20 @@ private[ml] object TreeEnsembleModel { * If -1, then numFeatures is set based on the max feature index in all trees. * @return Feature importance values, of length numFeatures. */ - def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): Vector = { - val totalImportances = new OpenHashMap[Int, Double]() + def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): IntFloatVector = { + val totalImportances = mutable.Map[Int, Float]() trees.foreach { tree => // Aggregate feature importance vector for this tree - val importances = new OpenHashMap[Int, Double]() + val importances = mutable.Map[Int, Float]() computeFeatureImportance(tree.rootNode, importances) // Normalize importance vector for this tree, and add it to total. // TODO: In the future, also support normalizing by tree.rootNode.impurityStats.count? - val treeNorm = importances.map(_._2).sum + val treeNorm = importances.values.sum if (treeNorm != 0) { importances.foreach { case (idx, impt) => val normImpt = impt / treeNorm - totalImportances.changeValue(idx, normImpt, _ + normImpt) + if (!totalImportances.contains(idx)) totalImportances += (idx -> normImpt) + else totalImportances.update(idx, totalImportances(idx) + normImpt) } } } @@ -157,11 +149,11 @@ private[ml] object TreeEnsembleModel { maxFeatureIndex + 1 } if (d == 0) { - assert(totalImportances.size == 0, s"Unknown error in computing feature" + + assert(totalImportances.isEmpty, s"Unknown error in computing feature" + s" importance: No splits found, but some non-zero importances.") } val (indices, values) = totalImportances.iterator.toSeq.sortBy(_._1).unzip - Vectors.sparse(d, indices.toArray, values.toArray) + VFactory.sparseFloatVector(d, indices.toArray, values.toArray) } /** @@ -181,7 +173,7 @@ private[ml] object TreeEnsembleModel { * If -1, then numFeatures is set based on the max feature index in all trees. * @return Feature importance values, of length numFeatures. */ - def featureImportances[M <: DecisionTreeModel : ClassTag](tree: M, numFeatures: Int): Vector = { + def featureImportances[M <: DecisionTreeModel : ClassTag](tree: M, numFeatures: Int): IntFloatVector = { featureImportances(Array(tree), numFeatures) } @@ -194,12 +186,13 @@ private[ml] object TreeEnsembleModel { */ def computeFeatureImportance( node: Node, - importances: OpenHashMap[Int, Double]): Unit = { + importances: mutable.Map[Int, Float]): Unit = { node match { case n: InternalNode => val feature = n.split.featureIndex val scaledGain = n.gain * n.impurityStats.count - importances.changeValue(feature, scaledGain, _ + scaledGain) + if (!importances.contains(feature)) importances += (feature -> scaledGain) + else importances.update(feature, importances(feature) + scaledGain) computeFeatureImportance(n.leftChild, importances) computeFeatureImportance(n.rightChild, importances) case n: LeafNode => @@ -213,17 +206,19 @@ private[ml] object TreeEnsembleModel { * * @param map Map with non-negative values. */ - def normalizeMapValues(map: OpenHashMap[Int, Double]): Unit = { - val total = map.map(_._2).sum + def normalizeMapValues(map: mutable.Map[Int, Float]): Unit = { + val total = map.values.sum if (total != 0) { val keys = map.iterator.map(_._1).toArray - keys.foreach { key => map.changeValue(key, 0.0, _ / total) } + keys.foreach { key => + if (!map.contains(key)) map += (key -> 0.0f) else map.update(key, map(key) / total) + } } } } /** Helper classes for tree model persistence */ -private[ml] object DecisionTreeModelReadWrite { +private[tree] object DecisionTreeModelReadWrite { /** * Info for a [[org.apache.spark.ml.tree.Split]] @@ -236,7 +231,7 @@ private[ml] object DecisionTreeModelReadWrite { */ case class SplitData( featureIndex: Int, - leftCategoriesOrThreshold: Array[Double], + leftCategoriesOrThreshold: Array[Float], numCategories: Int) { def getSplit: Split = { @@ -272,10 +267,10 @@ private[ml] object DecisionTreeModelReadWrite { */ case class NodeData( id: Int, - prediction: Double, - impurity: Double, - impurityStats: Array[Double], - gain: Double, + prediction: Float, + impurity: Float, + impurityStats: Array[Float], + gain: Float, leftChild: Int, rightChild: Int, split: SplitData) @@ -298,33 +293,11 @@ private[ml] object DecisionTreeModelReadWrite { (thisNodeData +: (leftNodeData ++ rightNodeData), rightIdx) case _: LeafNode => (Seq(NodeData(id, node.prediction, node.impurity, node.impurityStats.stats, - -1.0, -1, -1, SplitData(-1, Array.empty[Double], -1))), + -1.0f, -1, -1, SplitData(-1, Array.empty[Float], -1))), id) } } - /** - * Load a decision tree from a file. - * @return Root node of reconstructed tree - */ - def loadTreeNodes( - path: String, - metadata: DefaultParamsReader.Metadata, - sparkSession: SparkSession): Node = { - import sparkSession.implicits._ - implicit val format = DefaultFormats - - // Get impurity to construct ImpurityCalculator for each node - val impurityType: String = { - val impurityJson: JValue = metadata.getParamValue("impurity") - Param.jsonDecode[String](compact(render(impurityJson))) - } - - val dataPath = new Path(path, "data").toString - val data = sparkSession.read.parquet(dataPath).as[NodeData] - buildTreeFromNodes(data.collect(), impurityType) - } - /** * Given all data for all nodes in a tree, rebuild the tree. * @param data Unsorted node data @@ -359,84 +332,7 @@ private[ml] object DecisionTreeModelReadWrite { } } -private[ml] object EnsembleModelReadWrite { - - /** - * Helper method for saving a tree ensemble to disk. - * - * @param instance Tree ensemble model - * @param path Path to which to save the ensemble model. - * @param extraMetadata Metadata such as numFeatures, numClasses, numTrees. - */ - def saveImpl[M <: Params with TreeEnsembleModel[_ <: DecisionTreeModel]]( - instance: M, - path: String, - sql: SparkSession, - extraMetadata: JObject): Unit = { - DefaultParamsWriter.saveMetadata(instance, path, sql.sparkContext, Some(extraMetadata)) - val treesMetadataWeights: Array[(Int, String, Double)] = instance.trees.zipWithIndex.map { - case (tree, treeID) => - (treeID, - DefaultParamsWriter.getMetadataToSave(tree.asInstanceOf[Params], sql.sparkContext), - instance.treeWeights(treeID)) - } - val treesMetadataPath = new Path(path, "treesMetadata").toString - sql.createDataFrame(treesMetadataWeights).toDF("treeID", "metadata", "weights") - .write.parquet(treesMetadataPath) - val dataPath = new Path(path, "data").toString - val nodeDataRDD = sql.sparkContext.parallelize(instance.trees.zipWithIndex).flatMap { - case (tree, treeID) => EnsembleNodeData.build(tree, treeID) - } - sql.createDataFrame(nodeDataRDD).write.parquet(dataPath) - } - - /** - * Helper method for loading a tree ensemble from disk. - * This reconstructs all trees, returning the root nodes. - * @param path Path given to `saveImpl` - * @param className Class name for ensemble model type - * @param treeClassName Class name for tree model type in the ensemble - * @return (ensemble metadata, array over trees of (tree metadata, root node)), - * where the root node is linked with all descendents - * @see `saveImpl` for how the model was saved - */ - def loadImpl( - path: String, - sql: SparkSession, - className: String, - treeClassName: String): (Metadata, Array[(Metadata, Node)], Array[Double]) = { - import sql.implicits._ - implicit val format = DefaultFormats - val metadata = DefaultParamsReader.loadMetadata(path, sql.sparkContext, className) - - // Get impurity to construct ImpurityCalculator for each node - val impurityType: String = { - val impurityJson: JValue = metadata.getParamValue("impurity") - Param.jsonDecode[String](compact(render(impurityJson))) - } - - val treesMetadataPath = new Path(path, "treesMetadata").toString - val treesMetadataRDD: RDD[(Int, (Metadata, Double))] = sql.read.parquet(treesMetadataPath) - .select("treeID", "metadata", "weights").as[(Int, String, Double)].rdd.map { - case (treeID: Int, json: String, weights: Double) => - treeID -> ((DefaultParamsReader.parseMetadata(json, treeClassName), weights)) - } - - val treesMetadataWeights = treesMetadataRDD.sortByKey().values.collect() - val treesMetadata = treesMetadataWeights.map(_._1) - val treesWeights = treesMetadataWeights.map(_._2) - - val dataPath = new Path(path, "data").toString - val nodeData: Dataset[EnsembleNodeData] = - sql.read.parquet(dataPath).as[EnsembleNodeData] - val rootNodesRDD: RDD[(Int, Node)] = - nodeData.rdd.map(d => (d.treeID, d.nodeData)).groupByKey().map { - case (treeID: Int, nodeData: Iterable[NodeData]) => - treeID -> DecisionTreeModelReadWrite.buildTreeFromNodes(nodeData.toArray, impurityType) - } - val rootNodes: Array[Node] = rootNodesRDD.sortByKey().values.collect() - (metadata, treesMetadata.zip(rootNodes), treesWeights) - } +private[tree] object EnsembleModelReadWrite { /** * Info for one [[Node]] in a tree ensemble diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala similarity index 92% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala index f81773f33..73f78f743 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/TreeParams.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala @@ -1,14 +1,10 @@ -package com.tencent.angel.ml.tree.conf +package com.tencent.angel.ml.tree import java.util.Locale -import scala.util.Try -import org.apache.spark.ml.param.shared._ -import org.apache.spark.ml.util.SchemaUtils import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo, BoostingStrategy => OldBoostingStrategy, Strategy => OldStrategy} import com.tencent.angel.ml.tree.impurity.{Entropy => OldEntropy, Gini => OldGini, Impurity => OldImpurity, Variance => OldVariance} import com.tencent.angel.ml.tree.loss.{AbsoluteError => OldAbsoluteError, ClassificationLoss => OldClassificationLoss, LogLoss => OldLogLoss, Loss => OldLoss, SquaredError => OldSquaredError} -import org.apache.spark.ml.param.{IntParam, ParamValidators} /** * Parameters for Decision Tree-based algorithms. @@ -83,31 +79,49 @@ trait DecisionTreeParams { " Caching can speed up training of deeper trees." - def setMaxDepth(value: Int): Unit = maxDepth = value + def setMaxDepth(value: Int): this.type = { + maxDepth = value + this + } def getMaxDepth: Int = maxDepth - def setMaxBins(value: Int): Unit = maxBins = value + def setMaxBins(value: Int): this.type = { + maxBins = value + this + } def getMaxBins: Int = maxBins - def setMinInstancesPerNode(value: Int): Unit = minInstancesPerNode = value + def setMinInstancesPerNode(value: Int): this.type = { + minInstancesPerNode = value + this + } def getMinInstancesPerNode: Int = minInstancesPerNode - def setMinInfoGain(value: Double): Unit = minInfoGain = value + def setMinInfoGain(value: Double): this.type = + { + minInfoGain = value + this + } def getMinInfoGain: Double = minInfoGain - def setMaxMemoryInMB(value: Int): Unit = maxMemoryInMB = value + def setMaxMemoryInMB(value: Int): this.type = { + maxMemoryInMB = value + this + } - final def getMaxMemoryInMB: Int = maxMemoryInMB + def getMaxMemoryInMB: Int = maxMemoryInMB - def setCacheNodeIds(value: Boolean): Unit = cacheNodeIds = value + def setCacheNodeIds(value: Boolean): this.type = { + cacheNodeIds = value + this + } final def getCacheNodeIds: Boolean = cacheNodeIds - def getOldStrategy( categoricalFeatures: Map[Int, Int], numClasses: Int, @@ -144,7 +158,10 @@ trait TreeClassifierParams { final val impurityInfo = "impurity: Criterion used for information gain calculation (case-insensitive). Supported options:" + s" ${TreeClassifierParams.supportedImpurities.mkString(", ")}" - def setImpurity(value: String): Unit = impurity = value + def setImpurity(value: String): this.type = { + impurity = value + this + } def getImpurity: String = impurity.toLowerCase(Locale.ROOT) @@ -185,7 +202,10 @@ trait TreeRegressorParams { final val impurityInfo = "impurity: Criterion used for information gain calculation (case-insensitive). Supported options:" + s" ${TreeRegressorParams.supportedImpurities.mkString(", ")}" - def setImpurity(value: String): Unit = impurity = value + def setImpurity(value: String): this.type = { + impurity = value + this + } def getImpurity: String = impurity.toLowerCase(Locale.ROOT) @@ -232,7 +252,10 @@ trait TreeEnsembleParams extends DecisionTreeParams { final val subsamplingRateInfo = "subsamplingRate: Fraction of the training data used for" + " learning each decision tree, in range (0, 1]." - def setSubsamplingRate(value: Double): Unit = subsamplingRate = value + def setSubsamplingRate(value: Double): this.type = { + subsamplingRate = value + this + } def getSubsamplingRate: Double = subsamplingRate @@ -274,7 +297,10 @@ trait TreeEnsembleParams extends DecisionTreeParams { final val featureSubsetStrategyInfo = "featureSubsetStrategy: The number of features to consider for splits at each tree node." + s" Supported options: ${TreeEnsembleParams.supportedFeatureSubsetStrategies.mkString(", ")},, (0.0-1.0], [1-n]." - def setFeatureSubsetStrategy(value: String): Unit = featureSubsetStrategy = value + def setFeatureSubsetStrategy(value: String): this.type = { + featureSubsetStrategy = value + this + } final def getFeatureSubsetStrategy: String = featureSubsetStrategy.toLowerCase(Locale.ROOT) } @@ -298,7 +324,10 @@ trait RandomForestParams extends TreeEnsembleParams { final var numTrees: Int = 20 final val numTreesInfo = "numTrees: Number of trees to train (>= 1)." - def setNumTrees(value: Int): Unit = numTrees = value + def setNumTrees(value: Int): this.type = { + numTrees = value + this + } def getNumTrees: Int = numTrees } @@ -333,6 +362,11 @@ trait GBTParams extends TreeEnsembleParams { " If the error rate on the validation input changes by less than the validationTol," + " then learning will stop early (before `maxIter`). This parameter is ignored when fit without validation is used." + def setValidationTol(value: Double): this.type = { + validationTol = value + this + } + def getValidationTol: Double = validationTol /** @@ -344,7 +378,10 @@ trait GBTParams extends TreeEnsembleParams { def getMaxIter: Int = maxIter - def setMaxIter(value: Int): Unit = maxIter = value + def setMaxIter(value: Int): this.type = { + maxIter = value + this + } /** * Param for Step size (a.k.a. learning rate) in interval (0, 1] for shrinking @@ -358,7 +395,10 @@ trait GBTParams extends TreeEnsembleParams { def getStepSize: Double = stepSize - def setStepSize(value: Double): Unit = stepSize = value + def setStepSize(value: Double): this.type = { + stepSize = value + this + } setFeatureSubsetStrategy("all") diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index 5b51b6151..4cc32a69e 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -28,10 +28,19 @@ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} * @param useNodeIdCache If this is true, instead of passing trees to executors, the algorithm will maintain a separate RDD of node Id cache for each row. * @param checkpointInterval How often to checkpoint when the node Id cache gets updated. E.g. 10 means that the cache will get checkpointed every 10 update. */ -class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impurity, var maxDepth: Int, var numClasses: Int = 2, var maxBins: Int = 32, - var quantileCalculationStrategy: QuantileStrategy = Sort, var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), - var minInstancesPerNode: Int = 1, var minInfoGain: Double = 0.0, var maxMemoryInMB: Int = 256, - var subsamplingRate: Double = 1, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { +class Strategy (@BeanProperty var algo: Algo, + @BeanProperty var impurity: Impurity, + @BeanProperty var maxDepth: Int, + @BeanProperty var numClasses: Int = 2, + @BeanProperty var maxBins: Int = 32, + var quantileCalculationStrategy: QuantileStrategy = Sort, + var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), + var minInstancesPerNode: Int = 1, + var minInfoGain: Double = 0.0, + var maxMemoryInMB: Int = 256, + var subsamplingRate: Double = 1, + var useNodeIdCache: Boolean = false, + var checkpointInterval: Int = 10) extends Serializable { def isMulticlassClassification: Boolean = { algo == Classification && numClasses > 2 diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala index cf13e7349..50a22a4d1 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Entropy.scala @@ -55,7 +55,7 @@ object Entropy extends Impurity { * Note: Instances of this class do not hold the data; they operate on views of the data. * @param numClasses Number of classes for label. */ -private class EntropyAggregator(numClasses: Int) +private[tree] class EntropyAggregator(numClasses: Int) extends ImpurityAggregator(numClasses) with Serializable { /** @@ -91,7 +91,7 @@ private class EntropyAggregator(numClasses: Int) * (node, feature, bin). * @param stats Array of sufficient statistics for a (node, feature, bin). */ -private class EntropyCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { +private[tree] class EntropyCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { /** * Make a deep copy of this [[ImpurityCalculator]]. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala index 3c6c48b37..4dc40aece 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Gini.scala @@ -52,7 +52,7 @@ object Gini extends Impurity { * Note: Instances of this class do not hold the data; they operate on views of the data. * @param numClasses Number of classes for label. */ -private class GiniAggregator(numClasses: Int) +private[tree] class GiniAggregator(numClasses: Int) extends ImpurityAggregator(numClasses) with Serializable { /** @@ -88,7 +88,7 @@ private class GiniAggregator(numClasses: Int) * (node, feature, bin). * @param stats Array of sufficient statistics for a (node, feature, bin). */ -private class GiniCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { +private[tree] class GiniCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { /** * Make a deep copy of this [[ImpurityCalculator]]. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala index cc8f6e979..277939e3b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurities.scala @@ -3,7 +3,7 @@ package com.tencent.angel.ml.tree.impurity /** * Factory for Impurity instances. */ -private object Impurities { +private[tree] object Impurities { def fromString(name: String): Impurity = name match { case "gini" => Gini diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala index 95568583b..fecc24244 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala @@ -34,7 +34,7 @@ trait Impurity extends Serializable { * Note: Instances of this class do not hold the data; they operate on views of the data. * @param statsSize Length of the vector of sufficient statistics for one bin. */ -private abstract class ImpurityAggregator(val statsSize: Int) extends Serializable { +private[tree] abstract class ImpurityAggregator(val statsSize: Int) extends Serializable { /** * Merge the stats from one bin into another. @@ -153,7 +153,7 @@ private[tree] abstract class ImpurityCalculator(val stats: Array[Float]) extends } -private object ImpurityCalculator { +private[tree] object ImpurityCalculator { /** * Create an [[ImpurityCalculator]] instance of the given impurity type and with diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala index 883ab412d..7c1f7294a 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Variance.scala @@ -42,7 +42,7 @@ object Variance extends Impurity { * in order to compute impurity from a sample. * Note: Instances of this class do not hold the data; they operate on views of the data. */ -private class VarianceAggregator() +private[tree] class VarianceAggregator() extends ImpurityAggregator(statsSize = 3) with Serializable { /** @@ -72,7 +72,7 @@ private class VarianceAggregator() * (node, feature, bin). * @param stats Array of sufficient statistics for a (node, feature, bin). */ -private class VarianceCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { +private[tree] class VarianceCalculator(stats: Array[Float]) extends ImpurityCalculator(stats) { require(stats.length == 3, s"VarianceCalculator requires sufficient statistics array stats to be of length 3," + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala index e94be520c..0533e43b6 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala @@ -2,7 +2,7 @@ package com.tencent.angel.ml.tree.loss import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.model.TreeEnsembleModel +import com.tencent.angel.ml.tree.oldmodel.TreeEnsembleModel /** * Trait for adding "pluggable" loss functions for the gradient boosting algorithm. @@ -29,7 +29,7 @@ trait Loss extends Serializable { */ def computeError(model: TreeEnsembleModel, data: List[LabeledData]): Double = { data.map(point => computeError(model.predict(point.getX.asInstanceOf[IntFloatVector]), point.getY)) - .reduce(_ + _) / data.length + .sum / data.length } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala new file mode 100644 index 000000000..09e1514e1 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala @@ -0,0 +1,107 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.tree.utils.XORShiftRandom +import org.apache.commons.math3.distribution.PoissonDistribution + +import scala.util.Random + + +/** + * Internal representation of a datapoint which belongs to several subsamples of the same dataset, + * particularly for bagging (e.g., for random forests). + * + * This holds one instance, as well as an array of weights which represent the (weighted) + * number of times which this instance appears in each subsamplingRate. + * E.g., (datum, [1, 0, 4]) indicates that there are 3 subsamples of the dataset and that + * this datum has 1 copy, 0 copies, and 4 copies in the 3 subsamples, respectively. + * + * @param datum Data instance + * @param subsampleWeights Weight of this instance in each subsampled dataset. + * + * TODO: This does not currently support (Double) weighted instances. Once MLlib has weighted + * dataset support, update. (We store subsampleWeights as Double for this future extension.) + */ +private[tree] class BaggedPoint[Datum](val datum: Datum, val subsampleWeights: Array[Float]) + extends Serializable + +private[tree] object BaggedPoint { + + /** + * Convert an input dataset into its BaggedPoint representation, + * choosing subsamplingRate counts for each instance. + * Each subsamplingRate has the same number of instances as the original dataset, + * and is created by subsampling without replacement. + * @param input Input dataset. + * @param subsamplingRate Fraction of the training data used for learning decision tree. + * @param numSubsamples Number of subsamples of this RDD to take. + * @param withReplacement Sampling with/without replacement. + * @param seed Random seed. + * @return BaggedPoint dataset representation. + */ + def convertToBaggedRDD[Datum] ( + input: Array[Datum], + subsamplingRate: Double, + numSubsamples: Int, + withReplacement: Boolean, + seed: Long = Random.nextLong()): Array[BaggedPoint[Datum]] = { + if (withReplacement) { + convertToBaggedRDDSamplingWithReplacement(input, subsamplingRate, numSubsamples, seed) + } else { + if (numSubsamples == 1 && subsamplingRate == 1.0) { + convertToBaggedRDDWithoutSampling(input) + } else { + convertToBaggedRDDSamplingWithoutReplacement(input, subsamplingRate, numSubsamples, seed) + } + } + } + + private def convertToBaggedRDDSamplingWithoutReplacement[Datum] ( + input: Array[Datum], + subsamplingRate: Double, + numSubsamples: Int, + seed: Long): Array[BaggedPoint[Datum]] = { + + // Use random seed = seed + numSubsamples + 1 to make generation reproducible. + val rng = new XORShiftRandom() + rng.setSeed(seed + numSubsamples + 1) + input.map { instance => + val subsampleWeights = new Array[Float](numSubsamples) + var subsampleIndex = 0 + while (subsampleIndex < numSubsamples) { + val x = rng.nextDouble() + subsampleWeights(subsampleIndex) = { + if (x < subsamplingRate) 1.0f else 0.0f + } + subsampleIndex += 1 + } + new BaggedPoint(instance, subsampleWeights) + } + } + + private def convertToBaggedRDDSamplingWithReplacement[Datum] ( + input: Array[Datum], + subsample: Double, + numSubsamples: Int, + seed: Long): Array[BaggedPoint[Datum]] = { + + // Use random seed = seed + partitionIndex + 1 to make generation reproducible. + val poisson = new PoissonDistribution(subsample) + poisson.reseedRandomGenerator(seed + numSubsamples + 1) + input.map { instance => + val subsampleWeights = new Array[Float](numSubsamples) + var subsampleIndex = 0 + while (subsampleIndex < numSubsamples) { + subsampleWeights(subsampleIndex) = poisson.sample() + subsampleIndex += 1 + } + new BaggedPoint(instance, subsampleWeights) + } + } + + private def convertToBaggedRDDWithoutSampling[Datum] ( + input: Array[Datum]): Array[BaggedPoint[Datum]] = { + input.map(datum => new BaggedPoint(datum, Array(1.0f))) + } + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala new file mode 100644 index 000000000..e4deb3763 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala @@ -0,0 +1,163 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.tree.impurity._ + +/** + * DecisionTree statistics aggregator for a node. + * This holds a flat array of statistics for a set of (features, bins) + * and helps with indexing. + * This class is abstract to support learning with and without feature subsampling. + */ +private[tree] class DTStatsAggregator( + val metadata: DecisionTreeMetadata, + featureSubset: Option[Array[Int]]) extends Serializable { + + /** + * [[ImpurityAggregator]] instance specifying the impurity type. + */ + val impurityAggregator: ImpurityAggregator = metadata.impurity match { + case Gini => new GiniAggregator(metadata.numClasses) + case Entropy => new EntropyAggregator(metadata.numClasses) + case Variance => new VarianceAggregator() + case _ => throw new IllegalArgumentException(s"Bad impurity parameter: ${metadata.impurity}") + } + + /** + * Number of elements (Double values) used for the sufficient statistics of each bin. + */ + private val statsSize: Int = impurityAggregator.statsSize + + /** + * Number of bins for each feature. This is indexed by the feature index. + */ + private val numBins: Array[Int] = { + if (featureSubset.isDefined) { + featureSubset.get.map(metadata.numBins(_)) + } else { + metadata.numBins + } + } + + /** + * Offset for each feature for calculating indices into the [[allStats]] array. + */ + private val featureOffsets: Array[Int] = { + numBins.scanLeft(0)((total, nBins) => total + statsSize * nBins) + } + + /** + * Total number of elements stored in this aggregator + */ + private val allStatsSize: Int = featureOffsets.last + + /** + * Flat array of elements. + * Index for start of stats for a (feature, bin) is: + * index = featureOffsets(featureIndex) + binIndex * statsSize + */ + private val allStats: Array[Float] = new Array[Float](allStatsSize) + + /** + * Array of parent node sufficient stats. + * Note: parent stats need to be explicitly tracked in the [[DTStatsAggregator]] for unordered + * categorical features, because the parent [[Node]] object does not have [[com.tencent.angel.ml.tree.oldmodel.ImpurityStats]] + * on the first iteration. + */ + private val parentStats: Array[Float] = new Array[Float](statsSize) + + /** + * Get an [[ImpurityCalculator]] for a given (node, feature, bin). + * + * @param featureOffset This is a pre-computed (node, feature) offset + * from [[getFeatureOffset]]. + */ + def getImpurityCalculator(featureOffset: Int, binIndex: Int): ImpurityCalculator = { + impurityAggregator.getCalculator(allStats, featureOffset + binIndex * statsSize) + } + + /** + * Get an [[ImpurityCalculator]] for the parent node. + */ + def getParentImpurityCalculator(): ImpurityCalculator = { + impurityAggregator.getCalculator(parentStats, 0) + } + + /** + * Update the stats for a given (feature, bin) for ordered features, using the given label. + */ + def update(featureIndex: Int, binIndex: Int, label: Float, instanceWeight: Float): Unit = { + val i = featureOffsets(featureIndex) + binIndex * statsSize + impurityAggregator.update(allStats, i, label, instanceWeight) + } + + /** + * Update the parent node stats using the given label. + */ + def updateParent(label: Float, instanceWeight: Float): Unit = { + impurityAggregator.update(parentStats, 0, label, instanceWeight) + } + + /** + * Faster version of [[update]]. + * Update the stats for a given (feature, bin), using the given label. + * + * @param featureOffset This is a pre-computed feature offset + * from [[getFeatureOffset]]. + */ + def featureUpdate( + featureOffset: Int, + binIndex: Int, + label: Float, + instanceWeight: Float): Unit = { + impurityAggregator.update(allStats, featureOffset + binIndex * statsSize, + label, instanceWeight) + } + + /** + * Pre-compute feature offset for use with [[featureUpdate]]. + * For ordered features only. + */ + def getFeatureOffset(featureIndex: Int): Int = featureOffsets(featureIndex) + + /** + * For a given feature, merge the stats for two bins. + * + * @param featureOffset This is a pre-computed feature offset + * from [[getFeatureOffset]]. + * @param binIndex The other bin is merged into this bin. + * @param otherBinIndex This bin is not modified. + */ + def mergeForFeature(featureOffset: Int, binIndex: Int, otherBinIndex: Int): Unit = { + impurityAggregator.merge(allStats, featureOffset + binIndex * statsSize, + featureOffset + otherBinIndex * statsSize) + } + + /** + * Merge this aggregator with another, and returns this aggregator. + * This method modifies this aggregator in-place. + */ + def merge(other: DTStatsAggregator): DTStatsAggregator = { + require(allStatsSize == other.allStatsSize, + s"DTStatsAggregator.merge requires that both aggregators have the same length stats vectors." + + s" This aggregator is of length $allStatsSize, but the other is ${other.allStatsSize}.") + var i = 0 + // TODO: Test BLAS.axpy + while (i < allStatsSize) { + allStats(i) += other.allStats(i) + i += 1 + } + + require(statsSize == other.statsSize, + s"DTStatsAggregator.merge requires that both aggregators have the same length parent " + + s"stats vectors. This aggregator's parent stats are length $statsSize, " + + s"but the other is ${other.statsSize}.") + var j = 0 + while (j < statsSize) { + parentStats(j) += other.parentStats(j) + j += 1 + } + + this + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala new file mode 100644 index 000000000..e510282f1 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala @@ -0,0 +1,85 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.math2.VFactory +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.{DecisionTreeClassifierParams, DecisionTreeModel, TreeEnsembleModel} +import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo} +import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} + +/** + * Decision tree model (http://en.wikipedia.org/wiki/Decision_tree_learning) for classification. + * It supports both binary and multiclass labels, as well as both continuous and categorical + * features. + */ +private[tree] class DecisionTreeClassificationModel ( + val rootNode: Node, + val numFeatures: Int, + val numClasses: Int) + extends DecisionTreeModel with DecisionTreeClassifierParams with Serializable { + + require(rootNode != null, + "DecisionTreeClassificationModel given null rootNode, but it requires a non-null rootNode.") + + def predict(features: IntFloatVector): Float = { + rootNode.predictImpl(features).prediction + } + + def predictRaw(features: IntFloatVector): IntFloatVector = { + VFactory.denseFloatVector(rootNode.predictImpl(features).impurityStats.stats.clone()) + } + + protected def raw2probabilityInPlace(rawPrediction: IntFloatVector): IntFloatVector = { + if (rawPrediction.isDense) { + ProbabilisticClassificationModel.normalizeToProbabilitiesInPlace(rawPrediction) + rawPrediction + } else { + throw new RuntimeException("Unexpected error in DecisionTreeClassificationModel:" + + " raw2probabilityInPlace encountered SparseVector") + } + } + + override def toString: String = { + s"DecisionTreeClassificationModel of depth $depth with $numNodes nodes" + } + + /** + * Estimate of the importance of each feature. + * + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * This feature importance is calculated as follows: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * + * @note Feature importance for single decision trees can have high variance due to + * correlated predictor variables. Consider using a RandomForestClassifier + * to determine feature importance instead. + */ + lazy val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) + + /** Convert to spark.mllib DecisionTreeModel (losing some information) */ + override private[tree] def toOld: OldDecisionTreeModel = { + new OldDecisionTreeModel(rootNode.toOld(1), OldAlgo.Classification) + } + +} + +object DecisionTreeClassificationModel { + + /** Convert a model from the old API */ + private[ml] def fromOld( + oldModel: OldDecisionTreeModel, + categoricalFeatures: Map[Int, Int], + numFeatures: Int = -1): DecisionTreeClassificationModel = { + require(oldModel.algo == OldAlgo.Classification, + s"Cannot convert non-classification DecisionTreeModel (old API) to" + + s" DecisionTreeClassificationModel (new API). Algo is: ${oldModel.algo}") + val rootNode = Node.fromOld(oldModel.topNode, categoricalFeatures) + // Can't infer number of features from old model, so default to -1 + new DecisionTreeClassificationModel(rootNode, numFeatures, -1) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala new file mode 100644 index 000000000..b9a23feb7 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala @@ -0,0 +1,218 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.TreeEnsembleParams + +import scala.collection.mutable +import scala.util.Try +import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.conf.QuantileStrategy._ +import com.tencent.angel.ml.tree.conf.Strategy +import com.tencent.angel.ml.tree.impurity.Impurity +import org.apache.commons.logging.LogFactory + +/** + * Learning and dataset metadata for DecisionTree. + * + * @param numClasses For classification: labels can take values {0, ..., numClasses - 1}. + * For regression: fixed at 0 (no meaning). + * @param maxBins Maximum number of bins, for all features. + * @param featureArity Map: categorical feature index to arity. + * I.e., the feature takes values in {0, ..., arity - 1}. + * @param numBins Number of bins for each feature. + */ +private[tree] class DecisionTreeMetadata( + val numFeatures: Int, + val numExamples: Long, + val numClasses: Int, + val maxBins: Int, + val featureArity: Map[Int, Int], + val unorderedFeatures: Set[Int], + val numBins: Array[Int], + val impurity: Impurity, + val quantileStrategy: QuantileStrategy, + val maxDepth: Int, + val minInstancesPerNode: Int, + val minInfoGain: Double, + val numTrees: Int, + val numFeaturesPerNode: Int) extends Serializable { + + def isUnordered(featureIndex: Int): Boolean = unorderedFeatures.contains(featureIndex) + + def isClassification: Boolean = numClasses >= 2 + + def isMulticlass: Boolean = numClasses > 2 + + def isMulticlassWithCategoricalFeatures: Boolean = isMulticlass && featureArity.nonEmpty + + def isCategorical(featureIndex: Int): Boolean = featureArity.contains(featureIndex) + + def isContinuous(featureIndex: Int): Boolean = !featureArity.contains(featureIndex) + + /** + * Number of splits for the given feature. + * For unordered features, there is 1 bin per split. + * For ordered features, there is 1 more bin than split. + */ + def numSplits(featureIndex: Int): Int = if (isUnordered(featureIndex)) { + numBins(featureIndex) + } else { + numBins(featureIndex) - 1 + } + + /** + * Set number of splits for a continuous feature. + * For a continuous feature, number of bins is number of splits plus 1. + */ + def setNumSplits(featureIndex: Int, numSplits: Int) { + require(isContinuous(featureIndex), + s"Only number of bin for a continuous feature can be set.") + numBins(featureIndex) = numSplits + 1 + } + + /** + * Indicates if feature subsampling is being used. + */ + def subsamplingFeatures: Boolean = numFeatures != numFeaturesPerNode + +} + +private[tree] object DecisionTreeMetadata { + + val LOG = LogFactory.getLog(classOf[DecisionTreeMetadata]) + + /** + * Construct a [[DecisionTreeMetadata]] instance for this dataset and parameters. + * This computes which categorical features will be ordered vs. unordered, + * as well as the number of splits and bins for each feature. + */ + def buildMetadata( + input: Array[LabeledData], + strategy: Strategy, + numTrees: Int, + featureSubsetStrategy: String): DecisionTreeMetadata = { + + val numFeatures = input(0).getX.asInstanceOf[IntFloatVector].getDim + if (numFeatures == 0) + throw new IllegalArgumentException(s"DecisionTree requires size of input RDD > 0, " + + s"but was given by empty one.") + require(numFeatures > 0, s"DecisionTree requires number of features > 0, " + + s"but was given an empty features vector") + val numExamples = input.size + val numClasses = strategy.algo match { + case Classification => strategy.numClasses + case Regression => 0 + } + + val maxPossibleBins = math.min(strategy.maxBins, numExamples) + if (maxPossibleBins < strategy.maxBins) { + LOG.error(s"DecisionTree reducing maxBins from ${strategy.maxBins} to $maxPossibleBins" + + s" (= number of training instances)") + } + + // We check the number of bins here against maxPossibleBins. + // This needs to be checked here instead of in Strategy since maxPossibleBins can be modified + // based on the number of training examples. + if (strategy.categoricalFeaturesInfo.nonEmpty) { + val maxCategoriesPerFeature = strategy.categoricalFeaturesInfo.values.max + val maxCategory = + strategy.categoricalFeaturesInfo.find(_._2 == maxCategoriesPerFeature).get._1 + require(maxCategoriesPerFeature <= maxPossibleBins, + s"DecisionTree requires maxBins (= $maxPossibleBins) to be at least as large as the " + + s"number of values in each categorical feature, but categorical feature $maxCategory " + + s"has $maxCategoriesPerFeature values. Considering remove this and other categorical " + + "features with a large number of values, or add more training examples.") + } + + val unorderedFeatures = new mutable.HashSet[Int]() + val numBins = Array.fill[Int](numFeatures)(maxPossibleBins) + if (numClasses > 2) { + // Multiclass classification + val maxCategoriesForUnorderedFeature = + ((math.log(maxPossibleBins / 2 + 1) / math.log(2.0)) + 1).floor.toInt + strategy.categoricalFeaturesInfo.foreach { case (featureIndex, numCategories) => + // Hack: If a categorical feature has only 1 category, we treat it as continuous. + // TODO(SPARK-9957): Handle this properly by filtering out those features. + if (numCategories > 1) { + // Decide if some categorical features should be treated as unordered features, + // which require 2 * ((1 << numCategories - 1) - 1) bins. + // We do this check with log values to prevent overflows in case numCategories is large. + // The next check is equivalent to: 2 * ((1 << numCategories - 1) - 1) <= maxBins + if (numCategories <= maxCategoriesForUnorderedFeature) { + unorderedFeatures.add(featureIndex) + numBins(featureIndex) = numUnorderedBins(numCategories) + } else { + numBins(featureIndex) = numCategories + } + } + } + } else { + // Binary classification or regression + strategy.categoricalFeaturesInfo.foreach { case (featureIndex, numCategories) => + // If a categorical feature has only 1 category, we treat it as continuous: SPARK-9957 + if (numCategories > 1) { + numBins(featureIndex) = numCategories + } + } + } + + // Set number of features to use per node (for random forests). + val _featureSubsetStrategy = featureSubsetStrategy match { + case "auto" => + if (numTrees == 1) { + "all" + } else { + if (strategy.algo == Classification) { + "sqrt" + } else { + "onethird" + } + } + case _ => featureSubsetStrategy + } + + val numFeaturesPerNode: Int = _featureSubsetStrategy match { + case "all" => numFeatures + case "sqrt" => math.sqrt(numFeatures).ceil.toInt + case "log2" => math.max(1, (math.log(numFeatures) / math.log(2)).ceil.toInt) + case "onethird" => (numFeatures / 3.0).ceil.toInt + case _ => + Try(_featureSubsetStrategy.toInt).filter(_ > 0).toOption match { + case Some(value) => math.min(value, numFeatures) + case None => + Try(_featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).toOption match { + case Some(value) => math.ceil(value * numFeatures).toInt + case _ => throw new IllegalArgumentException(s"Supported values:" + + s" ${TreeEnsembleParams.supportedFeatureSubsetStrategies.mkString(", ")}," + + s" (0.0-1.0], [1-n].") + } + } + } + + new DecisionTreeMetadata(numFeatures, numExamples, numClasses, numBins.max, + strategy.categoricalFeaturesInfo, unorderedFeatures.toSet, numBins, + strategy.impurity, strategy.quantileCalculationStrategy, strategy.maxDepth, + strategy.minInstancesPerNode, strategy.minInfoGain, numTrees, numFeaturesPerNode) + } + + /** + * Version of [[DecisionTreeMetadata#buildMetadata]] for DecisionTree. + */ + def buildMetadata( + input: Array[LabeledData], + strategy: Strategy): DecisionTreeMetadata = { + buildMetadata(input, strategy, numTrees = 1, featureSubsetStrategy = "all") + } + + /** + * Given the arity of a categorical feature (arity = number of categories), + * return the number of bins for the feature if it is to be treated as an unordered feature. + * There is 1 split for every partitioning of categories into 2 disjoint, non-empty sets; + * there are math.pow(2, arity - 1) - 1 such splits. + * Each split has 2 corresponding bins. + */ + def numUnorderedBins(arity: Int): Int = (1 << arity - 1) - 1 + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala new file mode 100644 index 000000000..a2f812541 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala @@ -0,0 +1,77 @@ +package com.tencent.angel.ml.tree.model + + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo} +import com.tencent.angel.ml.tree.TreeEnsembleModel +import com.tencent.angel.ml.tree.DecisionTreeModel +import com.tencent.angel.ml.tree.DecisionTreeRegressorParams +import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} + + +/** + * + * Decision tree (Wikipedia) model for regression. + * It supports both continuous and categorical features. + * @param rootNode Root of the decision tree + */ +private[tree] class DecisionTreeRegressionModel ( + val rootNode: Node, + val numFeatures: Int) + extends DecisionTreeModel with DecisionTreeRegressorParams { + + require(rootNode != null, + "DecisionTreeRegressionModel given null rootNode, but it requires a non-null rootNode.") + + def predict(features: IntFloatVector): Float = { + rootNode.predictImpl(features).prediction + } + + /** We need to update this function if we ever add other impurity measures. */ + def predictVariance(features: IntFloatVector): Float = { + rootNode.predictImpl(features).impurityStats.calculate() + } + + override def toString: String = { + s"DecisionTreeRegressionModel of depth $depth with $numNodes nodes" + } + + /** + * Estimate of the importance of each feature. + * + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * This feature importance is calculated as follows: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * + * @note Feature importance for single decision trees can have high variance due to + * correlated predictor variables. Consider using a RandomForestRegressor + * to determine feature importance instead. + */ + lazy val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) + + /** Convert to spark.mllib DecisionTreeModel (losing some information) */ + def toOld: OldDecisionTreeModel = { + new OldDecisionTreeModel(rootNode.toOld(1), OldAlgo.Regression) + } +} + +object DecisionTreeRegressionModel { + + /** Convert a model from the old API */ + private[ml] def fromOld( + oldModel: OldDecisionTreeModel, + categoricalFeatures: Map[Int, Int], + numFeatures: Int = -1): DecisionTreeRegressionModel = { + require(oldModel.algo == OldAlgo.Regression, + s"Cannot convert non-regression DecisionTreeModel (old API) to" + + s" DecisionTreeRegressionModel (new API). Algo is: ${oldModel.algo}") + val rootNode = Node.fromOld(oldModel.topNode, categoricalFeatures) + new DecisionTreeRegressionModel(rootNode, numFeatures) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala index 61ce77331..23e83fbad 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala @@ -1,166 +1,333 @@ package com.tencent.angel.ml.tree.model import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.conf.FeatureType._ +import com.tencent.angel.ml.tree.impurity.ImpurityCalculator +import com.tencent.angel.ml.tree.oldmodel.{ImpurityStats, InformationGainStats => OldInformationGainStats, Node => OldNode, Predict => OldPredict} /** - * Node in a decision tree. - * - * About node indexing: - * Nodes are indexed from 1. Node 1 is the root; nodes 2, 3 are the left, right children. - * Node index 0 is not used. - * - * @param id integer node id, from 1 - * @param predict predicted value at the node - * @param impurity current node impurity - * @param isLeaf whether the node is a leaf - * @param split split to calculate left and right nodes - * @param leftNode left child - * @param rightNode right child - * @param stats information gain stats + * Decision tree node interface. */ -class Node ( - val id: Int, - var predict: Predict, - var impurity: Float, - var isLeaf: Boolean, - var split: Option[Split], - var leftNode: Option[Node], - var rightNode: Option[Node], - var stats: Option[InformationGainStats]) extends Serializable { +sealed abstract class Node extends Serializable { - override def toString: String = { - s"id = $id, isLeaf = $isLeaf, predict = $predict, impurity = $impurity, " + - s"split = $split, stats = $stats" - } + /** Prediction a leaf node makes, or which an internal node would make if it were a leaf node */ + def prediction: Float + + /** Impurity measure at this node (for training data) */ + def impurity: Float + + /** + * Statistics aggregated from training data at this node, used to compute prediction, impurity, + * and probabilities. + * For classification, the array of class counts must be normalized to a probability distribution. + */ + private[tree] def impurityStats: ImpurityCalculator + + /** Recursive prediction helper method */ + private[tree] def predictImpl(features: IntFloatVector): LeafNode + + /** + * Get the number of nodes in tree below this node, including leaf nodes. + * E.g., if this is a leaf, returns 0. If both children are leaves, returns 2. + */ + private[tree] def numDescendants: Int /** - * predict value if node is not leaf - * @param features feature value - * @return predicted value + * Recursive print function. + * @param indentFactor The number of spaces to add to each level of indentation. */ - def predict(features: IntFloatVector): Double = { - if (isLeaf) { - predict.predict + private[tree] def subtreeToString(indentFactor: Int = 0): String + + /** + * Get depth of tree from this node. + * E.g.: Depth 0 means this is a leaf node. Depth 1 means 1 internal and 2 leaf nodes. + */ + private[tree] def subtreeDepth: Int + + /** + * Create a copy of this node in the old Node format, recursively creating child nodes as needed. + * @param id Node ID using old format IDs + */ + private[tree] def toOld(id: Int): OldNode + + /** + * Trace down the tree, and return the largest feature index used in any split. + * @return Max feature index used in a split, or -1 if there are no splits (single leaf node). + */ + private[tree] def maxSplitFeatureIndex(): Int + + /** Returns a deep copy of the subtree rooted at this node. */ + private[tree] def deepCopy(): Node +} + +object Node { + + /** + * Create a new Node from the old Node format, recursively creating child nodes as needed. + */ + def fromOld(oldNode: OldNode, categoricalFeatures: Map[Int, Int]): Node = { + if (oldNode.isLeaf) { + new LeafNode(prediction = oldNode.predict.predict, + impurity = oldNode.impurity, impurityStats = null) } else { - if (split.get.featureType == Continuous) { - if (features.get(split.get.feature) <= split.get.threshold) { - leftNode.get.predict(features) - } else { - rightNode.get.predict(features) - } + val gain = if (oldNode.stats.nonEmpty) { + oldNode.stats.get.gain } else { - if (split.get.categories.contains(features.get(split.get.feature))) { - leftNode.get.predict(features) - } else { - rightNode.get.predict(features) - } + 0.0f } + new InternalNode(prediction = oldNode.predict.predict, impurity = oldNode.impurity, + gain = gain, leftChild = fromOld(oldNode.leftNode.get, categoricalFeatures), + rightChild = fromOld(oldNode.rightNode.get, categoricalFeatures), + split = Split.fromOld(oldNode.split.get, categoricalFeatures), impurityStats = null) } } +} - /** - * Returns a deep copy of the subtree rooted at this node. - */ - def deepCopy(): Node = { - val leftNodeCopy = if (leftNode.isEmpty) { - None - } else { - Some(leftNode.get.deepCopy()) - } - val rightNodeCopy = if (rightNode.isEmpty) { - None +/** + * Decision tree leaf node. + * @param prediction Prediction this node makes + * @param impurity Impurity measure at this node (for training data) + */ +class LeafNode private[tree] ( + override val prediction: Float, + override val impurity: Float, + override private[tree] val impurityStats: ImpurityCalculator) extends Node { + + override def toString: String = + s"LeafNode(prediction = $prediction, impurity = $impurity)" + + override private[tree] def predictImpl(features: IntFloatVector): LeafNode = this + + override private[tree] def numDescendants: Int = 0 + + override private[tree] def subtreeToString(indentFactor: Int = 0): String = { + val prefix: String = " " * indentFactor + prefix + s"Predict: $prediction\n" + } + + override private[tree] def subtreeDepth: Int = 0 + + override private[ml] def toOld(id: Int): OldNode = { + new OldNode(id, new OldPredict(prediction, prob = impurityStats.prob(prediction)), + impurity, isLeaf = true, None, None, None, None) + } + + override private[ml] def maxSplitFeatureIndex(): Int = -1 + + override private[tree] def deepCopy(): Node = { + new LeafNode(prediction, impurity, impurityStats) + } +} + +/** + * Internal Decision Tree node. + * @param prediction Prediction this node would make if it were a leaf node + * @param impurity Impurity measure at this node (for training data) + * @param gain Information gain value. Values less than 0 indicate missing values; + * this quirk will be removed with future updates. + * @param leftChild Left-hand child node + * @param rightChild Right-hand child node + * @param split Information about the test used to split to the left or right child. + */ +class InternalNode private[ml] ( + override val prediction: Float, + override val impurity: Float, + val gain: Float, + val leftChild: Node, + val rightChild: Node, + val split: Split, + override private[ml] val impurityStats: ImpurityCalculator) extends Node { + + // Note to developers: The constructor argument impurityStats should be reconsidered before we + // make the constructor public. We may be able to improve the representation. + + override def toString: String = { + s"InternalNode(prediction = $prediction, impurity = $impurity, split = $split)" + } + + override private[ml] def predictImpl(features: IntFloatVector): LeafNode = { + if (split.shouldGoLeft(features)) { + leftChild.predictImpl(features) } else { - Some(rightNode.get.deepCopy()) + rightChild.predictImpl(features) } - new Node(id, predict, impurity, isLeaf, split, leftNodeCopy, rightNodeCopy, stats) } + override private[tree] def numDescendants: Int = { + 2 + leftChild.numDescendants + rightChild.numDescendants + } + + override private[tree] def subtreeToString(indentFactor: Int = 0): String = { + val prefix: String = " " * indentFactor + prefix + s"If (${InternalNode.splitToString(split, left = true)})\n" + + leftChild.subtreeToString(indentFactor + 1) + + prefix + s"Else (${InternalNode.splitToString(split, left = false)})\n" + + rightChild.subtreeToString(indentFactor + 1) + } + + override private[tree] def subtreeDepth: Int = { + 1 + math.max(leftChild.subtreeDepth, rightChild.subtreeDepth) + } + + override private[ml] def toOld(id: Int): OldNode = { + assert(id.toLong * 2 < Int.MaxValue, "Decision Tree could not be converted from new to old API" + + " since the old API does not support deep trees.") + new OldNode(id, new OldPredict(prediction, prob = impurityStats.prob(prediction)), impurity, + isLeaf = false, Some(split.toOld), Some(leftChild.toOld(OldNode.leftChildIndex(id))), + Some(rightChild.toOld(OldNode.rightChildIndex(id))), + Some(new OldInformationGainStats(gain, impurity, leftChild.impurity, rightChild.impurity, + new OldPredict(leftChild.prediction, prob = 0.0f), + new OldPredict(rightChild.prediction, prob = 0.0f)))) + } + + override private[ml] def maxSplitFeatureIndex(): Int = { + math.max(split.featureIndex, + math.max(leftChild.maxSplitFeatureIndex(), rightChild.maxSplitFeatureIndex())) + } + + override private[tree] def deepCopy(): Node = { + new InternalNode(prediction, impurity, gain, leftChild.deepCopy(), rightChild.deepCopy(), + split, impurityStats) + } +} + +private object InternalNode { + /** - * Get the number of nodes in tree below this node, including leaf nodes. - * E.g., if this is a leaf, returns 0. If both children are leaves, returns 2. + * Helper method for [[Node.subtreeToString()]]. + * @param split Split to print + * @param left Indicates whether this is the part of the split going to the left, + * or that going to the right. */ - def numDescendants: Int = if (isLeaf) { - 0 - } else { - 2 + leftNode.get.numDescendants + rightNode.get.numDescendants + private def splitToString(split: Split, left: Boolean): String = { + val featureStr = s"feature ${split.featureIndex}" + split match { + case contSplit: ContinuousSplit => + if (left) { + s"$featureStr <= ${contSplit.threshold}" + } else { + s"$featureStr > ${contSplit.threshold}" + } + case catSplit: CategoricalSplit => + val categoriesStr = catSplit.leftCategories.mkString("{", ",", "}") + if (left) { + s"$featureStr in $categoriesStr" + } else { + s"$featureStr not in $categoriesStr" + } + } } +} + +/** + * Version of a node used in learning. This uses vars so that we can modify nodes as we split the + * tree by adding children, etc. + * + * For now, we use node IDs. These will be kept internal since we hope to remove node IDs + * in the future, or at least change the indexing (so that we can support much deeper trees). + * + * This node can either be: + * - a leaf node, with leftChild, rightChild, split set to null, or + * - an internal node, with all values set + * + * @param id We currently use the same indexing as the old implementation in + * [[org.apache.spark.mllib.tree.model.Node]], but this will change later. + * @param isLeaf Indicates whether this node will definitely be a leaf in the learned tree, + * so that we do not need to consider splitting it further. + * @param stats Impurity statistics for this node. + */ +private[tree] class LearningNode( + var id: Int, + var leftChild: Option[LearningNode], + var rightChild: Option[LearningNode], + var split: Option[Split], + var isLeaf: Boolean, + var stats: ImpurityStats) extends Serializable { + + def toNode: Node = toNode(prune = true) /** - * Get depth of tree from this node. - * E.g.: Depth 0 means this is a leaf node. + * Convert this [[LearningNode]] to a regular [[Node]], and recurse on any children. */ - def subtreeDepth: Int = if (isLeaf) { - 0 - } else { - 1 + math.max(leftNode.get.subtreeDepth, rightNode.get.subtreeDepth) + def toNode(prune: Boolean = true): Node = { + + if (leftChild.nonEmpty || rightChild.nonEmpty) { + assert(leftChild.nonEmpty && rightChild.nonEmpty && split.nonEmpty && stats != null, + "Unknown error during Decision Tree learning. Could not convert LearningNode to Node.") + (leftChild.get.toNode(prune), rightChild.get.toNode(prune)) match { + case (l: LeafNode, r: LeafNode) if prune && l.prediction == r.prediction => + new LeafNode(l.prediction, stats.impurity, stats.impurityCalculator) + case (l, r) => + new InternalNode(stats.impurityCalculator.predict, stats.impurity, stats.gain, + l, r, split.get, stats.impurityCalculator) + } + } else { + if (stats.valid) { + new LeafNode(stats.impurityCalculator.predict, stats.impurity, + stats.impurityCalculator) + } else { + // Here we want to keep same behavior with the old mllib.DecisionTreeModel + new LeafNode(stats.impurityCalculator.predict, -1.0f, stats.impurityCalculator) + } + } } /** - * Recursive print function. - * @param indentFactor The number of spaces to add to each level of indentation. + * Get the node index corresponding to this data point. + * This function mimics prediction, passing an example from the root node down to a leaf + * or unsplit node; that node's index is returned. + * + * @param binnedFeatures Binned feature vector for data point. + * @param splits possible splits for all features, indexed (numFeatures)(numSplits) + * @return Leaf index if the data point reaches a leaf. + * Otherwise, last node reachable in tree matching this example. + * Note: This is the global node index, i.e., the index used in the tree. + * This index is different from the index used during training a particular + * group of nodes on one call to + * [[org.apache.spark.ml.tree.impl.RandomForest.findBestSplits()]]. */ - def subtreeToString(indentFactor: Int = 0): String = { - - def splitToString(split: Split, left: Boolean): String = { - split.featureType match { - case Continuous => if (left) { - s"(feature ${split.feature} <= ${split.threshold})" + def predictImpl(binnedFeatures: Array[Int], splits: Array[Array[Split]]): Int = { + if (this.isLeaf || this.split.isEmpty) { + this.id + } else { + val split = this.split.get + val featureIndex = split.featureIndex + val splitLeft = split.shouldGoLeft(binnedFeatures(featureIndex), splits(featureIndex)) + if (this.leftChild.isEmpty) { + // Not yet split. Return next layer of nodes to train + if (splitLeft) { + LearningNode.leftChildIndex(this.id) } else { - s"(feature ${split.feature} > ${split.threshold})" + LearningNode.rightChildIndex(this.id) } - case Categorical => if (left) { - s"(feature ${split.feature} in ${split.categories.mkString("{", ",", "}")})" + } else { + if (splitLeft) { + this.leftChild.get.predictImpl(binnedFeatures, splits) } else { - s"(feature ${split.feature} not in ${split.categories.mkString("{", ",", "}")})" + this.rightChild.get.predictImpl(binnedFeatures, splits) } } } - val prefix: String = " " * indentFactor - if (isLeaf) { - prefix + s"Predict: ${predict.predict}\n" - } else { - prefix + s"If ${splitToString(split.get, left = true)}\n" + - leftNode.get.subtreeToString(indentFactor + 1) + - prefix + s"Else ${splitToString(split.get, left = false)}\n" + - rightNode.get.subtreeToString(indentFactor + 1) - } } - /** Returns an iterator that traverses (DFS, left to right) the subtree of this node. */ - def subtreeIterator: Iterator[Node] = { - Iterator.single(this) ++ leftNode.map(_.subtreeIterator).getOrElse(Iterator.empty) ++ - rightNode.map(_.subtreeIterator).getOrElse(Iterator.empty) - } } -object Node { +private[tree] object LearningNode { - /** - * Return a node with the given node id (but nothing else set). - */ - def emptyNode(nodeIndex: Int): Node = new Node(nodeIndex, new Predict(Float.MinValue), -1.0f, - false, None, None, None, None) - - /** - * Construct a node with nodeIndex, predict, impurity and isLeaf parameters. - * This is used in `DecisionTree.findBestSplits` to construct child nodes - * after finding the best splits for parent nodes. - * Other fields are set at next level. - * @param nodeIndex integer node id, from 1 - * @param predict predicted value at the node - * @param impurity current node impurity - * @param isLeaf whether the node is a leaf - * @return new node instance - */ + /** Create a node with some of its fields set. */ def apply( - nodeIndex: Int, - predict: Predict, - impurity: Float, - isLeaf: Boolean): Node = { - new Node(nodeIndex, predict, impurity, isLeaf, None, None, None, None) + id: Int, + isLeaf: Boolean, + stats: ImpurityStats): LearningNode = { + new LearningNode(id, None, None, None, false, stats) } + /** Create an empty node with the given node index. Values must be set later on. */ + def emptyNode(nodeIndex: Int): LearningNode = { + new LearningNode(nodeIndex, None, None, None, false, null) + } + + // The below indexing methods were copied from spark.mllib.tree.model.Node + /** * Return the index of the left child of this node. */ @@ -207,14 +374,14 @@ object Node { * Traces down from a root node to get the node with the given node index. * This assumes the node exists. */ - def getNode(nodeIndex: Int, rootNode: Node): Node = { - var tmpNode: Node = rootNode + def getNode(nodeIndex: Int, rootNode: LearningNode): LearningNode = { + var tmpNode: LearningNode = rootNode var levelsToGo = indexToLevel(nodeIndex) while (levelsToGo > 0) { if ((nodeIndex & (1 << levelsToGo - 1)) == 0) { - tmpNode = tmpNode.leftNode.get + tmpNode = tmpNode.leftChild.get } else { - tmpNode = tmpNode.rightNode.get + tmpNode = tmpNode.rightChild.get } levelsToGo -= 1 } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala new file mode 100644 index 000000000..bcc565880 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala @@ -0,0 +1,90 @@ +package com.tencent.angel.ml.tree.model + +import scala.collection.mutable + + +/** + * This is used by the node id cache to find the child id that a data point would belong to. + * @param split Split information. + * @param nodeIndex The current node index of a data point that this will update. + */ +private[tree] case class NodeIndexUpdater(split: Split, nodeIndex: Int) { + + /** + * Determine a child node index based on the feature value and the split. + * @param binnedFeature Binned feature value. + * @param splits Split information to convert the bin indices to approximate feature values. + * @return Child node index to update to. + */ + def updateNodeIndex(binnedFeature: Int, splits: Array[Split]): Int = { + if (split.shouldGoLeft(binnedFeature, splits)) { + LearningNode.leftChildIndex(nodeIndex) + } else { + LearningNode.rightChildIndex(nodeIndex) + } + } +} + +/** + * Each TreePoint belongs to a particular node per tree. + * Each row in the nodeIdsForInstances RDD is an array over trees of the node index + * in each tree. Initially, values should all be 1 for root node. + * The nodeIdsForInstances RDD needs to be updated at each iteration. + * @param nodeIdsForInstances The initial values in the cache + * (should be an Array of all 1's (meaning the root nodes)). + */ +private[tree] class NodeIdCache(var nodeIdsForInstances: Array[Array[Int]]) { + + private var updateCount = 0 + + /** + * Update the node index values in the cache. + * This updates the RDD and its lineage. + * TODO: Passing bin information to executors seems unnecessary and costly. + * @param data training rows. + * @param nodeIdUpdaters A map of node index updaters. + * The key is the indices of nodes that we want to update. + * @param splits Split information needed to find child node indices. + */ + def updateNodeIndices( + data: Array[BaggedPoint[TreePoint]], + nodeIdUpdaters: Array[mutable.Map[Int, NodeIndexUpdater]], + splits: Array[Array[Split]]): Unit = { + + nodeIdsForInstances = data.zip(nodeIdsForInstances).map { case (point, ids) => + var treeId = 0 + while (treeId < nodeIdUpdaters.length) { + val nodeIdUpdater = nodeIdUpdaters(treeId).getOrElse(ids(treeId), null) + if (nodeIdUpdater != null) { + val featureIndex = nodeIdUpdater.split.featureIndex + val newNodeIndex = nodeIdUpdater.updateNodeIndex( + binnedFeature = point.datum.binnedFeatures(featureIndex), + splits = splits(featureIndex)) + ids(treeId) = newNodeIndex + } + treeId += 1 + } + ids + } + + updateCount += 1 + } +} + +private[tree] object NodeIdCache { + /** + * Initialize the node Id cache with initial node Id values. + * @param data The Array of training rows. + * @param numTrees The number of trees that we want to create cache for. + * @param initVal The initial values in the cache. + * @return A node Id cache containing an Array of initial root node Indices. + */ + def init( + data: Array[BaggedPoint[TreePoint]], + numTrees: Int, + initVal: Int = 1): NodeIdCache = { + new NodeIdCache( + data.map(_ => Array.fill[Int](numTrees)(initVal))) + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala new file mode 100644 index 000000000..c88002400 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala @@ -0,0 +1,32 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.math2.vector.IntFloatVector + +object ProbabilisticClassificationModel { + + /** + * Normalize a vector of raw predictions to be a multinomial probability vector, in place. + * + * The input raw predictions should be nonnegative. + * The output vector sums to 1. + * + * NOTE: This is NOT applicable to all models, only ones which effectively use class + * instance counts for raw predictions. + * + * @throws IllegalArgumentException if the input vector is all-0 or including negative values + */ + def normalizeToProbabilitiesInPlace(v: IntFloatVector): Unit = { + (0 until v.dim.toInt).foreach{ idx => + require(v.get(idx) >= 0, + "The input raw predictions should be non-negative.") + } + val sum = v.getStorage.getValues.sum + require(sum > 0, "Can't normalize the 0-vector.") + var i = 0 + val size = v.size + while (i < size) { + v.set(i, v.get(i) / sum) + i += 1 + } + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala new file mode 100644 index 000000000..9e1e08233 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -0,0 +1,1087 @@ +package com.tencent.angel.ml.tree.model + +import scala.collection.mutable +import scala.util.Random +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.utils.{SamplingUtils, TimeTracker} +import com.tencent.angel.ml.tree.DecisionTreeModel +import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo, Strategy => OldStrategy} +import com.tencent.angel.ml.tree.impurity.ImpurityCalculator +import com.tencent.angel.ml.tree.oldmodel.ImpurityStats +import org.apache.commons.logging.LogFactory + +/** + * ALGORITHM + * + * This is a sketch of the algorithm to help new developers. + * + * The algorithm partitions data by instances (rows). + * On each iteration, the algorithm splits a set of nodes. In order to choose the best split + * for a given node, sufficient statistics are collected from the distributed data. + * For each node, the statistics are collected to some worker node, and that worker selects + * the best split. + * + * This setup requires discretization of continuous features. This binning is done in the + * findSplits() method during initialization, after which each continuous feature becomes + * an ordered discretized feature with at most maxBins possible values. + * + * The main loop in the algorithm operates on a queue of nodes (nodeStack). These nodes + * lie at the periphery of the tree being trained. If multiple trees are being trained at once, + * then this queue contains nodes from all of them. Each iteration works roughly as follows: + * On the master node: + * - Some number of nodes are pulled off of the queue (based on the amount of memory + * required for their sufficient statistics). + * - For random forests, if featureSubsetStrategy is not "all," then a subset of candidate + * features are chosen for each node. See method selectNodesToSplit(). + * On worker nodes, via method findBestSplits(): + * - The worker makes one pass over its subset of instances. + * - For each (tree, node, feature, split) tuple, the worker collects statistics about + * splitting. Note that the set of (tree, node) pairs is limited to the nodes selected + * from the queue for this iteration. The set of features considered can also be limited + * based on featureSubsetStrategy. + * - For each node, the statistics for that node are aggregated to a particular worker + * via reduceByKey(). The designated worker chooses the best (feature, split) pair, + * or chooses to stop splitting if the stopping criteria are met. + * On the master node: + * - The master collects all decisions about splitting nodes and updates the model. + * - The updated model is passed to the workers on the next iteration. + * This process continues until the node queue is empty. + * + * Most of the methods in this implementation support the statistics aggregation, which is + * the heaviest part of the computation. In general, this implementation is bound by either + * the cost of statistics computation on workers or by communicating the sufficient statistics. + */ +private[tree] object RandomForest { + + private val LOG = LogFactory.getLog("RandomForest") + + /** + * Train a random forest. + * + * @param trainData Training data: Array of `LabeledData` + * @param validData Validation data: Array of `LabeledData` + * @return an unweighted set of trees + */ + def train( + trainData: Array[LabeledData], + validData: Array[LabeledData], + strategy: OldStrategy, + numTrees: Int, + featureSubsetStrategy: String, + seed: Long, + // exposed for testing only, real trees are always prune + prune: Boolean = true): Array[DecisionTreeModel] = { + + val timer = new TimeTracker() + + timer.start("total") + + timer.start("init") + + val metadata = + DecisionTreeMetadata.buildMetadata(trainData, strategy, numTrees, featureSubsetStrategy) + + LOG.info("numFeatures: " + metadata.numFeatures) + LOG.info("numClasses: " + metadata.numClasses) + LOG.info("numExamples: " + metadata.numExamples) + + // Find the splits and the corresponding bins (interval between the splits) using a sample + // of the input data. + timer.start("findSplits") + val splits = findSplits(trainData, metadata, seed) + timer.stop("findSplits") + LOG.info("numBins: feature: number of bins") + LOG.info(Range(0, metadata.numFeatures).map { featureIndex => + s"\t$featureIndex\t${metadata.numBins(featureIndex)}" + }.mkString("\n")) + + // Bin feature values (TreePoint representation). + // Cache input RDD for speedup during multiple passes. + val trainTreeInput = TreePoint.convertToTreePoint(trainData, splits, metadata) + val validTreeInput = TreePoint.convertToTreePoint(validData, splits, metadata) + + val withReplacement = numTrees > 1 + + val baggedInput = BaggedPoint + .convertToBaggedRDD(trainTreeInput, strategy.subsamplingRate, numTrees, withReplacement, seed) + + // depth of the decision tree + val maxDepth = strategy.maxDepth + require(maxDepth <= 30, + s"DecisionTree currently only supports maxDepth <= 30, but was given maxDepth = $maxDepth.") + + // Max memory usage for aggregates + // TODO: Calculate memory usage more precisely. + val maxMemoryUsage: Long = strategy.maxMemoryInMB * 1024L * 1024L + LOG.info("max memory usage for aggregates = " + maxMemoryUsage + " bytes.") + + /* + * The main idea here is to perform group-wise training of the decision tree nodes thus + * reducing the passes over the data from (# nodes) to (# nodes / maxNumberOfNodesPerGroup). + * Each data sample is handled by a particular node (or it reaches a leaf and is not used + * in lower levels). + */ + + // Create an RDD of node Id cache. + // At first, all the rows belong to the root nodes (node Id == 1). + val nodeIdCache = if (strategy.useNodeIdCache) { + Some(NodeIdCache.init( + data = baggedInput, + numTrees = numTrees)) + } else { + None + } + + /* + Stack of nodes to train: (treeIndex, node) + The reason this is a stack is that we train many trees at once, but we want to focus on + completing trees, rather than training all simultaneously. If we are splitting nodes from + 1 tree, then the new nodes to split will be put at the top of this stack, so we will continue + training the same tree in the next iteration. This focus allows us to send fewer trees to + workers on each iteration; see topNodesForGroup below. + */ + val nodeStack = new mutable.ArrayStack[(Int, LearningNode)] + + val rng = new Random() + rng.setSeed(seed) + + // Allocate and queue root nodes. + val topNodes = Array.fill[LearningNode](numTrees)(LearningNode.emptyNode(nodeIndex = 1)) + Range(0, numTrees).foreach(treeIndex => nodeStack.push((treeIndex, topNodes(treeIndex)))) + + timer.stop("init") + + while (nodeStack.nonEmpty) { + // Collect some nodes to split, and choose features for each node (if subsampling). + // Each group of nodes may come from one or multiple trees, and at multiple levels. + val (nodesForGroup, treeToNodeToIndexInfo) = + RandomForest.selectNodesToSplit(nodeStack, maxMemoryUsage, metadata, rng) + // Sanity check (should never occur): + assert(nodesForGroup.nonEmpty, + s"RandomForest selected empty nodesForGroup. Error for unknown reason.") + + // Only send trees to worker if they contain nodes being split this iteration. + val topNodesForGroup: Map[Int, LearningNode] = + nodesForGroup.keys.map(treeIdx => treeIdx -> topNodes(treeIdx)).toMap + + // Choose node splits, and enqueue new nodes as needed. + timer.start("findBestSplits") + RandomForest.findBestSplits(baggedInput, metadata, topNodesForGroup, nodesForGroup, + treeToNodeToIndexInfo, splits, nodeStack, timer, nodeIdCache) + timer.stop("findBestSplits") + } + + timer.stop("total") + + LOG.info("Internal timing for DecisionTree:") + LOG.info(s"$timer") + + val numFeatures = metadata.numFeatures + + if (strategy.algo == OldAlgo.Classification) { + topNodes.map { rootNode => + new DecisionTreeClassificationModel(rootNode.toNode(prune), numFeatures, + strategy.getNumClasses) + } + } else { + topNodes.map(rootNode => + new DecisionTreeRegressionModel(rootNode.toNode(prune), numFeatures)) + } + } + + /** + * Helper for binSeqOp, for data which can contain a mix of ordered and unordered features. + * + * For ordered features, a single bin is updated. + * For unordered features, bins correspond to subsets of categories; either the left or right bin + * for each subset is updated. + * + * @param agg Array storing aggregate calculation, with a set of sufficient statistics for + * each (feature, bin). + * @param treePoint Data point being aggregated. + * @param splits possible splits indexed (numFeatures)(numSplits) + * @param unorderedFeatures Set of indices of unordered features. + * @param instanceWeight Weight (importance) of instance in dataset. + */ + private def mixedBinSeqOp( + agg: DTStatsAggregator, + treePoint: TreePoint, + splits: Array[Array[Split]], + unorderedFeatures: Set[Int], + instanceWeight: Float, + featuresForNode: Option[Array[Int]]): Unit = { + val numFeaturesPerNode = if (featuresForNode.nonEmpty) { + // Use subsampled features + featuresForNode.get.length + } else { + // Use all features + agg.metadata.numFeatures + } + // Iterate over features. + var featureIndexIdx = 0 + while (featureIndexIdx < numFeaturesPerNode) { + val featureIndex = if (featuresForNode.nonEmpty) { + featuresForNode.get.apply(featureIndexIdx) + } else { + featureIndexIdx + } + if (unorderedFeatures.contains(featureIndex)) { + // Unordered feature + val featureValue = treePoint.binnedFeatures(featureIndex) + val leftNodeFeatureOffset = agg.getFeatureOffset(featureIndexIdx) + // Update the left or right bin for each split. + val numSplits = agg.metadata.numSplits(featureIndex) + val featureSplits = splits(featureIndex) + var splitIndex = 0 + while (splitIndex < numSplits) { + if (featureSplits(splitIndex).shouldGoLeft(featureValue, featureSplits)) { + agg.featureUpdate(leftNodeFeatureOffset, splitIndex, treePoint.label, instanceWeight) + } + splitIndex += 1 + } + } else { + // Ordered feature + val binIndex = treePoint.binnedFeatures(featureIndex) + agg.update(featureIndexIdx, binIndex, treePoint.label, instanceWeight) + } + featureIndexIdx += 1 + } + } + + /** + * Helper for binSeqOp, for regression and for classification with only ordered features. + * + * For each feature, the sufficient statistics of one bin are updated. + * + * @param agg Array storing aggregate calculation, with a set of sufficient statistics for + * each (feature, bin). + * @param treePoint Data point being aggregated. + * @param instanceWeight Weight (importance) of instance in dataset. + */ + private def orderedBinSeqOp( + agg: DTStatsAggregator, + treePoint: TreePoint, + instanceWeight: Float, + featuresForNode: Option[Array[Int]]): Unit = { + val label = treePoint.label + + // Iterate over features. + if (featuresForNode.nonEmpty) { + // Use subsampled features + var featureIndexIdx = 0 + while (featureIndexIdx < featuresForNode.get.length) { + val binIndex = treePoint.binnedFeatures(featuresForNode.get.apply(featureIndexIdx)) + agg.update(featureIndexIdx, binIndex, label, instanceWeight) + featureIndexIdx += 1 + } + } else { + // Use all features + val numFeatures = agg.metadata.numFeatures + var featureIndex = 0 + while (featureIndex < numFeatures) { + val binIndex = treePoint.binnedFeatures(featureIndex) + agg.update(featureIndex, binIndex, label, instanceWeight) + featureIndex += 1 + } + } + } + + /** + * Given a group of nodes, this finds the best split for each node. + * + * @param input Training data: RDD of [[TreePoint]] + * @param metadata Learning and dataset metadata + * @param topNodesForGroup For each tree in group, tree index -> root node. + * Used for matching instances with nodes. + * @param nodesForGroup Mapping: treeIndex --> nodes to be split in tree + * @param treeToNodeToIndexInfo Mapping: treeIndex --> nodeIndex --> nodeIndexInfo, + * where nodeIndexInfo stores the index in the group and the + * feature subsets (if using feature subsets). + * @param splits possible splits for all features, indexed (numFeatures)(numSplits) + * @param nodeStack Queue of nodes to split, with values (treeIndex, node). + * Updated with new non-leaf nodes which are created. + * @param nodeIdCache Node Id cache containing an RDD of Array[Int] where + * each value in the array is the data point's node Id + * for a corresponding tree. This is used to prevent the need + * to pass the entire tree to the executors during + * the node stat aggregation phase. + */ + private[tree] def findBestSplits( + input: Array[BaggedPoint[TreePoint]], + metadata: DecisionTreeMetadata, + topNodesForGroup: Map[Int, LearningNode], + nodesForGroup: Map[Int, Array[LearningNode]], + treeToNodeToIndexInfo: Map[Int, Map[Int, NodeIndexInfo]], + splits: Array[Array[Split]], + nodeStack: mutable.ArrayStack[(Int, LearningNode)], + timer: TimeTracker = new TimeTracker, + nodeIdCache: Option[NodeIdCache] = None): Unit = { + + /* + * The high-level descriptions of the best split optimizations are noted here. + * + * *Group-wise training* + * We perform bin calculations for groups of nodes to reduce the number of + * passes over the data. Each iteration requires more computation and storage, + * but saves several iterations over the data. + * + * *Bin-wise computation* + * We use a bin-wise best split computation strategy instead of a straightforward best split + * computation strategy. Instead of analyzing each sample for contribution to the left/right + * child node impurity of every split, we first categorize each feature of a sample into a + * bin. We exploit this structure to calculate aggregates for bins and then use these aggregates + * to calculate information gain for each split. + * + * *Aggregation over partitions* + * Instead of performing a flatMap/reduceByKey operation, we exploit the fact that we know + * the number of splits in advance. Thus, we store the aggregates (at the appropriate + * indices) in a single array for all bins and rely upon the RDD aggregate method to + * drastically reduce the communication overhead. + */ + + // numNodes: Number of nodes in this group + val numNodes = nodesForGroup.values.map(_.length).sum + LOG.info("numNodes = " + numNodes) + LOG.info("numFeatures = " + metadata.numFeatures) + LOG.info("numClasses = " + metadata.numClasses) + LOG.info("isMulticlass = " + metadata.isMulticlass) + LOG.info("isMulticlassWithCategoricalFeatures = " + + metadata.isMulticlassWithCategoricalFeatures) + LOG.info("using nodeIdCache = " + nodeIdCache.nonEmpty.toString) + + /* + * Performs a sequential aggregation over a partition for a particular tree and node. + * For each feature, the aggregate sufficient statistics are updated for the relevant bins. + * + * @param treeIndex Index of the tree that we want to perform aggregation for. + * @param nodeInfo The node info for the tree node. + * @param agg Array storing aggregate calculation, with a set of sufficient statistics for each (node, feature, bin). + * @param baggedPoint Data point being aggregated. + */ + def nodeBinSeqOp( + treeIndex: Int, + nodeInfo: NodeIndexInfo, + agg: Array[DTStatsAggregator], + baggedPoint: BaggedPoint[TreePoint]): Unit = { + if (nodeInfo != null) { + val aggNodeIndex = nodeInfo.nodeIndexInGroup + val featuresForNode = nodeInfo.featureSubset + val instanceWeight = baggedPoint.subsampleWeights(treeIndex) + if (metadata.unorderedFeatures.isEmpty) { + orderedBinSeqOp(agg(aggNodeIndex), baggedPoint.datum, instanceWeight, featuresForNode) + } else { + mixedBinSeqOp(agg(aggNodeIndex), baggedPoint.datum, splits, + metadata.unorderedFeatures, instanceWeight, featuresForNode) + } + agg(aggNodeIndex).updateParent(baggedPoint.datum.label, instanceWeight) + } + } + + /* + * Performs a sequential aggregation over a partition. + * + * Each data point contributes to one node. For each feature, + * the aggregate sufficient statistics are updated for the relevant bins. + * + * @param agg Array storing aggregate calculation, with a set of sufficient statistics for + * each (node, feature, bin). + * @param baggedPoint Data point being aggregated. + * @return agg + */ + def binSeqOp( + agg: Array[DTStatsAggregator], + baggedPoint: BaggedPoint[TreePoint]): Array[DTStatsAggregator] = { + treeToNodeToIndexInfo.foreach { case (treeIndex, nodeIndexToInfo) => + val nodeIndex = + topNodesForGroup(treeIndex).predictImpl(baggedPoint.datum.binnedFeatures, splits) + nodeBinSeqOp(treeIndex, nodeIndexToInfo.getOrElse(nodeIndex, null), agg, baggedPoint) + } + agg + } + + /** + * Do the same thing as binSeqOp, but with nodeIdCache. + */ + def binSeqOpWithNodeIdCache( + agg: Array[DTStatsAggregator], + dataPoint: (BaggedPoint[TreePoint], Array[Int])): Array[DTStatsAggregator] = { + treeToNodeToIndexInfo.foreach { case (treeIndex, nodeIndexToInfo) => + val baggedPoint = dataPoint._1 + val nodeIdCache = dataPoint._2 + val nodeIndex = nodeIdCache(treeIndex) + nodeBinSeqOp(treeIndex, nodeIndexToInfo.getOrElse(nodeIndex, null), agg, baggedPoint) + } + + agg + } + + /** + * Get node index in group --> features indices map, + * which is a short cut to find feature indices for a node given node index in group. + */ + def getNodeToFeatures( + treeToNodeToIndexInfo: Map[Int, Map[Int, NodeIndexInfo]]): Option[Map[Int, Array[Int]]] = { + if (!metadata.subsamplingFeatures) { + None + } else { + val mutableNodeToFeatures = new mutable.HashMap[Int, Array[Int]]() + treeToNodeToIndexInfo.values.foreach { nodeIdToNodeInfo => + nodeIdToNodeInfo.values.foreach { nodeIndexInfo => + assert(nodeIndexInfo.featureSubset.isDefined) + mutableNodeToFeatures(nodeIndexInfo.nodeIndexInGroup) = nodeIndexInfo.featureSubset.get + } + } + Some(mutableNodeToFeatures.toMap) + } + } + + // array of nodes to train indexed by node index in group + val nodes = new Array[LearningNode](numNodes) + nodesForGroup.foreach { case (treeIndex, nodesForTree) => + nodesForTree.foreach { node => + nodes(treeToNodeToIndexInfo(treeIndex)(node.id).nodeIndexInGroup) = node + } + } + + // Calculate best splits for all nodes in the group + timer.start("chooseSplits") + + // In each partition, iterate all instances and compute aggregate stats for each node, + // yield a (nodeIndex, nodeAggregateStats) pair for each node. + // After a `reduceByKey` operation, stats of a node will be shuffled to a particular partition and be combined together, + // then best splits for nodes are found there. + // Finally, only best Splits for nodes are collected to driver to construct decision tree. + val nodeToFeatures = getNodeToFeatures(treeToNodeToIndexInfo) + + // Construct a nodeStatsAggregators array to hold node aggregate stats, + // each node will have a nodeStatsAggregator + val nodeStatsAggregators = Array.tabulate(numNodes) { nodeIndex => + val featuresForNode = nodeToFeatures.get.get(nodeIndex) + new DTStatsAggregator(metadata, featuresForNode) + } + + if (nodeIdCache.nonEmpty) { + // iterator all instances in current partition and update aggregate stats + input.zip(nodeIdCache.get.nodeIdsForInstances).map{ binSeqOpWithNodeIdCache(nodeStatsAggregators, _) } + } else { + // iterator all instances in current partition and update aggregate stats + input.map{ binSeqOp(nodeStatsAggregators, _) } + } + + val nodeToBestSplits = nodeStatsAggregators.zipWithIndex.map { + case (aggStats, nodeIndex) => + val featuresForNode = nodeToFeatures.get.get(nodeIndex) + // find best split for each node + val (split: Split, stats: ImpurityStats) = + binsToBestSplit(aggStats, splits, featuresForNode, nodes(nodeIndex)) + (nodeIndex, (split, stats)) + }.toMap + + timer.stop("chooseSplits") + + val nodeIdUpdaters = if (nodeIdCache.nonEmpty) { + Array.fill[mutable.Map[Int, NodeIndexUpdater]]( + metadata.numTrees)(mutable.Map[Int, NodeIndexUpdater]()) + } else { + null + } + // Iterate over all nodes in this group. + nodesForGroup.foreach { case (treeIndex, nodesForTree) => + nodesForTree.foreach { node => + val nodeIndex = node.id + val nodeInfo = treeToNodeToIndexInfo(treeIndex)(nodeIndex) + val aggNodeIndex = nodeInfo.nodeIndexInGroup + val (split: Split, stats: ImpurityStats) = + nodeToBestSplits(aggNodeIndex) + LOG.info("best split = " + split) + + // Extract info for this node. Create children if not leaf. + val isLeaf = + (stats.gain <= 0) || (LearningNode.indexToLevel(nodeIndex) == metadata.maxDepth) + node.isLeaf = isLeaf + node.stats = stats + LOG.info("Node = " + node) + + if (!isLeaf) { + node.split = Some(split) + val childIsLeaf = (LearningNode.indexToLevel(nodeIndex) + 1) == metadata.maxDepth + val leftChildIsLeaf = childIsLeaf || (stats.leftImpurity == 0.0) + val rightChildIsLeaf = childIsLeaf || (stats.rightImpurity == 0.0) + node.leftChild = Some(LearningNode(LearningNode.leftChildIndex(nodeIndex), + leftChildIsLeaf, ImpurityStats.getEmptyImpurityStats(stats.leftImpurityCalculator))) + node.rightChild = Some(LearningNode(LearningNode.rightChildIndex(nodeIndex), + rightChildIsLeaf, ImpurityStats.getEmptyImpurityStats(stats.rightImpurityCalculator))) + + if (nodeIdCache.nonEmpty) { + val nodeIndexUpdater = NodeIndexUpdater( + split = split, + nodeIndex = nodeIndex) + nodeIdUpdaters(treeIndex).put(nodeIndex, nodeIndexUpdater) + } + + // enqueue left child and right child if they are not leaves + if (!leftChildIsLeaf) { + nodeStack.push((treeIndex, node.leftChild.get)) + } + if (!rightChildIsLeaf) { + nodeStack.push((treeIndex, node.rightChild.get)) + } + + LOG.info("leftChildIndex = " + node.leftChild.get.id + + ", impurity = " + stats.leftImpurity) + LOG.info("rightChildIndex = " + node.rightChild.get.id + + ", impurity = " + stats.rightImpurity) + } + } + } + + if (nodeIdCache.nonEmpty) { + // Update the cache if needed. + nodeIdCache.get.updateNodeIndices(input, nodeIdUpdaters, splits) + } + } + + /** + * Calculate the impurity statistics for a given (feature, split) based upon left/right + * aggregates. + * + * @param stats the recycle impurity statistics for this feature's all splits, + * only 'impurity' and 'impurityCalculator' are valid between each iteration + * @param leftImpurityCalculator left node aggregates for this (feature, split) + * @param rightImpurityCalculator right node aggregate for this (feature, split) + * @param metadata learning and dataset metadata for DecisionTree + * @return Impurity statistics for this (feature, split) + */ + private def calculateImpurityStats( + stats: ImpurityStats, + leftImpurityCalculator: ImpurityCalculator, + rightImpurityCalculator: ImpurityCalculator, + metadata: DecisionTreeMetadata): ImpurityStats = { + + val parentImpurityCalculator: ImpurityCalculator = if (stats == null) { + leftImpurityCalculator.copy.add(rightImpurityCalculator) + } else { + stats.impurityCalculator + } + + val impurity: Float = if (stats == null) { + parentImpurityCalculator.calculate() + } else { + stats.impurity + } + + val leftCount = leftImpurityCalculator.count + val rightCount = rightImpurityCalculator.count + + val totalCount = leftCount + rightCount + + // If left child or right child doesn't satisfy minimum instances per node, + // then this split is invalid, return invalid information gain stats. + if ((leftCount < metadata.minInstancesPerNode) || + (rightCount < metadata.minInstancesPerNode)) { + return ImpurityStats.getInvalidImpurityStats(parentImpurityCalculator) + } + + val leftImpurity = leftImpurityCalculator.calculate() // Note: This equals 0 if count = 0 + val rightImpurity = rightImpurityCalculator.calculate() + + val leftWeight = leftCount / totalCount.toFloat + val rightWeight = rightCount / totalCount.toFloat + + val gain = impurity - leftWeight * leftImpurity - rightWeight * rightImpurity + + // if information gain doesn't satisfy minimum information gain, + // then this split is invalid, return invalid information gain stats. + if (gain < metadata.minInfoGain) { + return ImpurityStats.getInvalidImpurityStats(parentImpurityCalculator) + } + + new ImpurityStats(gain, impurity, parentImpurityCalculator, + leftImpurityCalculator, rightImpurityCalculator) + } + + /** + * Find the best split for a node. + * + * @param binAggregates Bin statistics. + * @return tuple for best split: (Split, information gain, prediction at node) + */ + private[tree] def binsToBestSplit( + binAggregates: DTStatsAggregator, + splits: Array[Array[Split]], + featuresForNode: Option[Array[Int]], + node: LearningNode): (Split, ImpurityStats) = { + + // Calculate InformationGain and ImpurityStats if current node is top node + val level = LearningNode.indexToLevel(node.id) + var gainAndImpurityStats: ImpurityStats = if (level == 0) { + null + } else { + node.stats + } + + val validFeatureSplits = + Range(0, binAggregates.metadata.numFeaturesPerNode).view.map { featureIndexIdx => + featuresForNode.map(features => (featureIndexIdx, features(featureIndexIdx))) + .getOrElse((featureIndexIdx, featureIndexIdx)) + }.withFilter { case (_, featureIndex) => + binAggregates.metadata.numSplits(featureIndex) != 0 + } + + // For each (feature, split), calculate the gain, and select the best (feature, split). + val splitsAndImpurityInfo = + validFeatureSplits.map { case (featureIndexIdx, featureIndex) => + val numSplits = binAggregates.metadata.numSplits(featureIndex) + if (binAggregates.metadata.isContinuous(featureIndex)) { + // Cumulative sum (scanLeft) of bin statistics. + // Afterwards, binAggregates for a bin is the sum of aggregates for + // that bin + all preceding bins. + val nodeFeatureOffset = binAggregates.getFeatureOffset(featureIndexIdx) + var splitIndex = 0 + while (splitIndex < numSplits) { + binAggregates.mergeForFeature(nodeFeatureOffset, splitIndex + 1, splitIndex) + splitIndex += 1 + } + // Find best split. + val (bestFeatureSplitIndex, bestFeatureGainStats) = + Range(0, numSplits).map { splitIdx => + val leftChildStats = binAggregates.getImpurityCalculator(nodeFeatureOffset, splitIdx) + val rightChildStats = + binAggregates.getImpurityCalculator(nodeFeatureOffset, numSplits) + rightChildStats.subtract(leftChildStats) + gainAndImpurityStats = calculateImpurityStats(gainAndImpurityStats, + leftChildStats, rightChildStats, binAggregates.metadata) + (splitIdx, gainAndImpurityStats) + }.maxBy(_._2.gain) + (splits(featureIndex)(bestFeatureSplitIndex), bestFeatureGainStats) + } else if (binAggregates.metadata.isUnordered(featureIndex)) { + // Unordered categorical feature + val leftChildOffset = binAggregates.getFeatureOffset(featureIndexIdx) + val (bestFeatureSplitIndex, bestFeatureGainStats) = + Range(0, numSplits).map { splitIndex => + val leftChildStats = binAggregates.getImpurityCalculator(leftChildOffset, splitIndex) + val rightChildStats = binAggregates.getParentImpurityCalculator() + .subtract(leftChildStats) + gainAndImpurityStats = calculateImpurityStats(gainAndImpurityStats, + leftChildStats, rightChildStats, binAggregates.metadata) + (splitIndex, gainAndImpurityStats) + }.maxBy(_._2.gain) + (splits(featureIndex)(bestFeatureSplitIndex), bestFeatureGainStats) + } else { + // Ordered categorical feature + val nodeFeatureOffset = binAggregates.getFeatureOffset(featureIndexIdx) + val numCategories = binAggregates.metadata.numBins(featureIndex) + + /* Each bin is one category (feature value). + * The bins are ordered based on centroidForCategories, and this ordering determines which + * splits are considered. (With K categories, we consider K - 1 possible splits.) + * + * centroidForCategories is a list: (category, centroid) + */ + val centroidForCategories = Range(0, numCategories).map { featureValue => + val categoryStats = + binAggregates.getImpurityCalculator(nodeFeatureOffset, featureValue) + val centroid = if (categoryStats.count != 0) { + if (binAggregates.metadata.isMulticlass) { + // multiclass classification + // For categorical variables in multiclass classification, + // the bins are ordered by the impurity of their corresponding labels. + categoryStats.calculate() + } else if (binAggregates.metadata.isClassification) { + // binary classification + // For categorical variables in binary classification, + // the bins are ordered by the count of class 1. + categoryStats.stats(1) + } else { + // regression + // For categorical variables in regression and binary classification, + // the bins are ordered by the prediction. + categoryStats.predict + } + } else { + Float.MaxValue + } + (featureValue, centroid) + } + + LOG.info("Centroids for categorical variable: " + centroidForCategories.mkString(",")) + + // bins sorted by centroids + val categoriesSortedByCentroid = centroidForCategories.toList.sortBy(_._2) + + LOG.info("Sorted centroids for categorical variable = " + + categoriesSortedByCentroid.mkString(",")) + + // Cumulative sum (scanLeft) of bin statistics. + // Afterwards, binAggregates for a bin is the sum of aggregates for + // that bin + all preceding bins. + var splitIndex = 0 + while (splitIndex < numSplits) { + val currentCategory = categoriesSortedByCentroid(splitIndex)._1 + val nextCategory = categoriesSortedByCentroid(splitIndex + 1)._1 + binAggregates.mergeForFeature(nodeFeatureOffset, nextCategory, currentCategory) + splitIndex += 1 + } + // lastCategory = index of bin with total aggregates for this (node, feature) + val lastCategory = categoriesSortedByCentroid.last._1 + // Find best split. + val (bestFeatureSplitIndex, bestFeatureGainStats) = + Range(0, numSplits).map { splitIndex => + val featureValue = categoriesSortedByCentroid(splitIndex)._1 + val leftChildStats = + binAggregates.getImpurityCalculator(nodeFeatureOffset, featureValue) + val rightChildStats = + binAggregates.getImpurityCalculator(nodeFeatureOffset, lastCategory) + rightChildStats.subtract(leftChildStats) + gainAndImpurityStats = calculateImpurityStats(gainAndImpurityStats, + leftChildStats, rightChildStats, binAggregates.metadata) + (splitIndex, gainAndImpurityStats) + }.maxBy(_._2.gain) + val categoriesForSplit = + categoriesSortedByCentroid.map(_._1.toFloat).slice(0, bestFeatureSplitIndex + 1) + val bestFeatureSplit = + new CategoricalSplit(featureIndex, categoriesForSplit.toArray, numCategories) + (bestFeatureSplit, bestFeatureGainStats) + } + } + + val (bestSplit, bestSplitStats) = + if (splitsAndImpurityInfo.isEmpty) { + // If no valid splits for features, then this split is invalid, + // return invalid information gain stats. Take any split and continue. + // Splits is empty, so arbitrarily choose to split on any threshold + val dummyFeatureIndex = featuresForNode.map(_.head).getOrElse(0) + val parentImpurityCalculator = binAggregates.getParentImpurityCalculator() + if (binAggregates.metadata.isContinuous(dummyFeatureIndex)) { + (new ContinuousSplit(dummyFeatureIndex, 0), + ImpurityStats.getInvalidImpurityStats(parentImpurityCalculator)) + } else { + val numCategories = binAggregates.metadata.featureArity(dummyFeatureIndex) + (new CategoricalSplit(dummyFeatureIndex, Array(), numCategories), + ImpurityStats.getInvalidImpurityStats(parentImpurityCalculator)) + } + } else { + splitsAndImpurityInfo.maxBy(_._2.gain) + } + (bestSplit, bestSplitStats) + } + + /** + * Returns splits for decision tree calculation. + * Continuous and categorical features are handled differently. + * + * Continuous features: + * For each feature, there are numBins - 1 possible splits representing the possible binary + * decisions at each node in the tree. + * This finds locations (feature values) for splits using a subsample of the data. + * + * Categorical features: + * For each feature, there is 1 bin per split. + * Splits and bins are handled in 2 ways: + * (a) "unordered features" + * For multiclass classification with a low-arity feature + * (i.e., if isMulticlass && isSpaceSufficientForAllCategoricalSplits), + * the feature is split based on subsets of categories. + * (b) "ordered features" + * For regression and binary classification, + * and for multiclass classification with a high-arity feature, + * there is one bin per category. + * + * @param input Training data: Array of [[LabeledData]] + * @param metadata Learning and dataset metadata + * @param seed random seed + * @return Splits, an Array of [[Split]] of size (numFeatures, numSplits) + */ + protected[tree] def findSplits( + input: Array[LabeledData], + metadata: DecisionTreeMetadata, + seed: Long): Array[Array[Split]] = { + + LOG.info("isMulticlass = " + metadata.isMulticlass) + + val numFeatures = metadata.numFeatures + + // Sample the input only if there are continuous features. + + val continuousFeatures = Range(0, numFeatures).filter(metadata.isContinuous) + /* + val sampledInput = if (continuousFeatures.nonEmpty) { + val fraction = samplesFractionForFindSplits(metadata) + LOG.info("fraction of data used for calculating quantiles = " + fraction) + Random.shuffle((0 to metadata.numExamples).toList).take((fraction * metadata.numExamples).toInt) + } else { + Array.empty[Int] + } + */ + + findSplitsBySorting(input, metadata, continuousFeatures) + } + + private def findSplitsBySorting( + input: Array[LabeledData], + metadata: DecisionTreeMetadata, + continuousFeatures: IndexedSeq[Int]): Array[Array[Split]] = { + + val continuousSplits: scala.collection.Map[Int, Array[Split]] = { + input.flatMap { point => + continuousFeatures.map(idx => (idx, point.getX.asInstanceOf[IntFloatVector].get(idx))).filter(_._2 != 0.0) + }.groupBy(_._1).mapValues(_.map(_._2)) + .map { case (idx, samples) => + val thresholds = findSplitsForContinuousFeature(samples, metadata, idx) + val splits: Array[Split] = thresholds.map(thresh => new ContinuousSplit(idx, thresh)) + LOG.info(s"featureIndex = $idx, numSplits = ${splits.length}") + (idx, splits) + } + } + + val numFeatures = metadata.numFeatures + val splits: Array[Array[Split]] = Array.tabulate(numFeatures) { + case i if metadata.isContinuous(i) => + // some features may contain only zero, so continuousSplits will not have a record + val split = continuousSplits.getOrElse(i, Array.empty[Split]) + metadata.setNumSplits(i, split.length) + split + + case i if metadata.isCategorical(i) && metadata.isUnordered(i) => + // Unordered features + // 2^(maxFeatureValue - 1) - 1 combinations + val featureArity = metadata.featureArity(i) + Array.tabulate[Split](metadata.numSplits(i)) { splitIndex => + val categories = extractMultiClassCategories(splitIndex + 1, featureArity) + new CategoricalSplit(i, categories.toArray, featureArity) + } + + case i if metadata.isCategorical(i) => + // Ordered features + // Splits are constructed as needed during training. + Array.empty[Split] + } + splits + } + + /** + * Nested method to extract list of eligible categories given an index. It extracts the + * position of ones in a binary representation of the input. If binary + * representation of an number is 01101 (13), the output list should (3.0, 2.0, + * 0.0). The maxFeatureValue depict the number of rightmost digits that will be tested for ones. + */ + private[tree] def extractMultiClassCategories( + input: Int, + maxFeatureValue: Int): List[Float] = { + var categories = List[Float]() + var j = 0 + var bitShiftedInput = input + while (j < maxFeatureValue) { + if (bitShiftedInput % 2 != 0) { + // updating the list of categories. + categories = j.toFloat :: categories + } + // Right shift by one + bitShiftedInput = bitShiftedInput >> 1 + j += 1 + } + categories + } + + /** + * Find splits for a continuous feature + * NOTE: Returned number of splits is set based on `featureSamples` and + * could be different from the specified `numSplits`. + * The `numSplits` attribute in the `DecisionTreeMetadata` class will be set accordingly. + * + * @param featureSamples feature values of each sample + * @param metadata decision tree metadata + * NOTE: `metadata.numbins` will be changed accordingly + * if there are not enough splits to be found + * @param featureIndex feature index to find splits + * @return array of split thresholds + */ + private[tree] def findSplitsForContinuousFeature( + featureSamples: Iterable[Float], + metadata: DecisionTreeMetadata, + featureIndex: Int): Array[Float] = { + require(metadata.isContinuous(featureIndex), + "findSplitsForContinuousFeature can only be used to find splits for a continuous feature.") + + val splits: Array[Float] = if (featureSamples.isEmpty) { + Array.empty[Float] + } else { + val numSplits = metadata.numSplits(featureIndex) + + // get count for each distinct value except zero value + val partNumSamples = featureSamples.size + val partValueCountMap = scala.collection.mutable.Map[Float, Int]() + featureSamples.foreach { x => + partValueCountMap(x) = partValueCountMap.getOrElse(x, 0) + 1 + } + + // Calculate the expected number of samples for finding splits + val numSamples = (samplesFractionForFindSplits(metadata) * metadata.numExamples).toInt + // add expected zero value count and get complete statistics + val valueCountMap: Map[Float, Int] = if (numSamples - partNumSamples > 0) { + partValueCountMap.toMap + (0.0f -> (numSamples - partNumSamples)) + } else { + partValueCountMap.toMap + } + + // sort distinct values + val valueCounts = valueCountMap.toSeq.sortBy(_._1).toArray + + val possibleSplits = valueCounts.length - 1 + if (possibleSplits == 0) { + // constant feature + Array.empty[Float] + } else if (possibleSplits <= numSplits) { + // if possible splits is not enough or just enough, just return all possible splits + (1 to possibleSplits) + .map(index => (valueCounts(index - 1)._1 + valueCounts(index)._1) / 2.0f) + .toArray + } else { + // stride between splits + val stride: Float = numSamples.toFloat / (numSplits + 1) + LOG.info("stride = " + stride) + + // iterate `valueCount` to find splits + val splitsBuilder = mutable.ArrayBuilder.make[Float] + var index = 1 + // currentCount: sum of counts of values that have been visited + var currentCount = valueCounts(0)._2 + // targetCount: target value for `currentCount`. + // If `currentCount` is closest value to `targetCount`, + // then current value is a split threshold. + // After finding a split threshold, `targetCount` is added by stride. + var targetCount = stride + while (index < valueCounts.length) { + val previousCount = currentCount + currentCount += valueCounts(index)._2 + val previousGap = math.abs(previousCount - targetCount) + val currentGap = math.abs(currentCount - targetCount) + // If adding count of current value to currentCount + // makes the gap between currentCount and targetCount smaller, + // previous value is a split threshold. + if (previousGap < currentGap) { + splitsBuilder += (valueCounts(index - 1)._1 + valueCounts(index)._1) / 2.0f + targetCount += stride + } + index += 1 + } + + splitsBuilder.result() + } + } + splits + } + + private[tree] class NodeIndexInfo( + val nodeIndexInGroup: Int, + val featureSubset: Option[Array[Int]]) extends Serializable + + /** + * Pull nodes off of the queue, and collect a group of nodes to be split on this iteration. + * This tracks the memory usage for aggregates and stops adding nodes when too much memory + * will be needed; this allows an adaptive number of nodes since different nodes may require + * different amounts of memory (if featureSubsetStrategy is not "all"). + * + * @param nodeStack Queue of nodes to split. + * @param maxMemoryUsage Bound on size of aggregate statistics. + * @return (nodesForGroup, treeToNodeToIndexInfo). + * nodesForGroup holds the nodes to split: treeIndex --> nodes in tree. + * + * treeToNodeToIndexInfo holds indices selected features for each node: + * treeIndex --> (global) node index --> (node index in group, feature indices). + * The (global) node index is the index in the tree; the node index in group is the + * index in [0, numNodesInGroup) of the node in this group. + * The feature indices are None if not subsampling features. + */ + private[tree] def selectNodesToSplit( + nodeStack: mutable.ArrayStack[(Int, LearningNode)], + maxMemoryUsage: Long, + metadata: DecisionTreeMetadata, + rng: Random): (Map[Int, Array[LearningNode]], Map[Int, Map[Int, NodeIndexInfo]]) = { + // Collect some nodes to split: + // nodesForGroup(treeIndex) = nodes to split + val mutableNodesForGroup = new mutable.HashMap[Int, mutable.ArrayBuffer[LearningNode]]() + val mutableTreeToNodeToIndexInfo = + new mutable.HashMap[Int, mutable.HashMap[Int, NodeIndexInfo]]() + var memUsage: Long = 0L + var numNodesInGroup = 0 + // If maxMemoryInMB is set very small, we want to still try to split 1 node, + // so we allow one iteration if memUsage == 0. + var groupDone = false + while (nodeStack.nonEmpty && !groupDone) { + val (treeIndex, node) = nodeStack.top + // Choose subset of features for node (if subsampling). + val featureSubset: Option[Array[Int]] = if (metadata.subsamplingFeatures) { + Some(SamplingUtils.reservoirSampleAndCount(Range(0, + metadata.numFeatures).iterator, metadata.numFeaturesPerNode, rng.nextLong())._1) + } else { + None + } + // Check if enough memory remains to add this node to the group. + val nodeMemUsage = RandomForest.aggregateSizeForNode(metadata, featureSubset) * 8L + if (memUsage + nodeMemUsage <= maxMemoryUsage || memUsage == 0) { + nodeStack.pop() + mutableNodesForGroup.getOrElseUpdate(treeIndex, new mutable.ArrayBuffer[LearningNode]()) += + node + mutableTreeToNodeToIndexInfo + .getOrElseUpdate(treeIndex, new mutable.HashMap[Int, NodeIndexInfo]())(node.id) + = new NodeIndexInfo(numNodesInGroup, featureSubset) + numNodesInGroup += 1 + memUsage += nodeMemUsage + } else { + groupDone = true + } + } + if (memUsage > maxMemoryUsage) { + // If maxMemoryUsage is 0, we should still allow splitting 1 node. + LOG.info(s"Tree learning is using approximately $memUsage bytes per iteration, which" + + s" exceeds requested limit maxMemoryUsage=$maxMemoryUsage. This allows splitting" + + s" $numNodesInGroup nodes in this iteration.") + } + // Convert mutable maps to immutable ones. + val nodesForGroup: Map[Int, Array[LearningNode]] = + mutableNodesForGroup.mapValues(_.toArray).toMap + val treeToNodeToIndexInfo = mutableTreeToNodeToIndexInfo.mapValues(_.toMap).toMap + (nodesForGroup, treeToNodeToIndexInfo) + } + + /** + * Get the number of values to be stored for this node in the bin aggregates. + * + * @param featureSubset Indices of features which may be split at this node. + * If None, then use all features. + */ + private def aggregateSizeForNode( + metadata: DecisionTreeMetadata, + featureSubset: Option[Array[Int]]): Long = { + val totalBins = if (featureSubset.nonEmpty) { + featureSubset.get.map(featureIndex => metadata.numBins(featureIndex).toLong).sum + } else { + metadata.numBins.map(_.toLong).sum + } + if (metadata.isClassification) { + metadata.numClasses * totalBins + } else { + 3 * totalBins + } + } + + /** + * Calculate the subsample fraction for finding splits + * + * @param metadata decision tree metadata + * @return subsample fraction + */ + private def samplesFractionForFindSplits( + metadata: DecisionTreeMetadata): Double = { + // Calculate the number of samples for approximate quantile calculation. + val requiredSamples = math.max(metadata.maxBins * metadata.maxBins, 10000) + if (requiredSamples < metadata.numExamples) { + requiredSamples.toDouble / metadata.numExamples + } else { + 1.0 + } + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala index 7fd00ff01..ffb051db8 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala @@ -1,49 +1,173 @@ package com.tencent.angel.ml.tree.model -import com.tencent.angel.ml.tree.conf.FeatureType.FeatureType +import java.util.Objects + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.conf.{FeatureType => OldFeatureType} +import com.tencent.angel.ml.tree.oldmodel.{Split => OldSplit} + /** - * Split applied to a feature - * @param feature feature index - * @param threshold Threshold for continuous feature. - * Split left if feature is less than or equal to threshold, else right. - * @param featureType type of feature -- categorical or continuous - * @param categories Split left if categorical feature value is in this set, else right. + * Interface for a "Split," which specifies a test made at a decision tree node + * to choose the left or right path. */ -case class Split( - feature: Int, - threshold: Float, - featureType: FeatureType, - categories: List[Float]) { +sealed trait Split extends Serializable { + + /** Index of feature which this split tests */ + def featureIndex: Int + + /** + * Return true (split to left) or false (split to right). + * @param features Vector of features (original values, not binned). + */ + private[tree] def shouldGoLeft(features: IntFloatVector): Boolean + + /** + * Return true (split to left) or false (split to right). + * @param binnedFeature Binned feature value. + * @param splits All splits for the given feature. + */ + private[tree] def shouldGoLeft(binnedFeature: Int, splits: Array[Split]): Boolean - override def toString: String = { - s"Feature = $feature, threshold = $threshold, featureType = $featureType, " + - s"categories = $categories" + /** Convert to old Split format */ + private[tree] def toOld: OldSplit +} + +private[tree] object Split { + + def fromOld(oldSplit: OldSplit, categoricalFeatures: Map[Int, Int]): Split = { + oldSplit.featureType match { + case OldFeatureType.Categorical => + new CategoricalSplit(featureIndex = oldSplit.feature, + _leftCategories = oldSplit.categories.toArray, categoricalFeatures(oldSplit.feature)) + case OldFeatureType.Continuous => + new ContinuousSplit(featureIndex = oldSplit.feature, threshold = oldSplit.threshold) + } } } /** - * Split with minimum threshold for continuous features. Helps with the smallest bin creation. - * @param feature feature index - * @param featureType type of feature -- categorical or continuous + * Split which tests a categorical feature. + * @param featureIndex Index of the feature to test + * @param _leftCategories If the feature value is in this set of categories, then the split goes + * left. Otherwise, it goes right. + * @param numCategories Number of categories for this feature. */ -private[tree] class DummyLowSplit(feature: Int, featureType: FeatureType) - extends Split(feature, Float.MinValue, featureType, List()) +class CategoricalSplit private[tree] ( + override val featureIndex: Int, + _leftCategories: Array[Float], + val numCategories: Int) + extends Split { -/** - * Split with maximum threshold for continuous features. Helps with the highest bin creation. - * @param feature feature index - * @param featureType type of feature -- categorical or continuous - */ -private[tree] class DummyHighSplit(feature: Int, featureType: FeatureType) - extends Split(feature, Float.MaxValue, featureType, List()) + require(_leftCategories.forall(cat => 0 <= cat && cat < numCategories), "Invalid leftCategories" + + s" (should be in range [0, $numCategories)): ${_leftCategories.mkString(",")}") + + /** + * If true, then "categories" is the set of categories for splitting to the left, and vice versa. + */ + private val isLeft: Boolean = _leftCategories.length <= numCategories / 2 + + /** Set of categories determining the splitting rule, along with [[isLeft]]. */ + private val categories: Set[Float] = { + if (isLeft) { + _leftCategories.toSet + } else { + setComplement(_leftCategories.toSet) + } + } + + override private[ml] def shouldGoLeft(features: IntFloatVector): Boolean = { + if (isLeft) { + categories.contains(features.get(featureIndex)) + } else { + !categories.contains(features.get(featureIndex)) + } + } + + override private[tree] def shouldGoLeft(binnedFeature: Int, splits: Array[Split]): Boolean = { + if (isLeft) { + categories.contains(binnedFeature.toFloat) + } else { + !categories.contains(binnedFeature.toFloat) + } + } + + override def hashCode(): Int = { + val state = Seq(featureIndex, isLeft, categories) + state.map(Objects.hashCode).foldLeft(0)((a, b) => 31 * a + b) + } + + override def equals(o: Any): Boolean = o match { + case other: CategoricalSplit => featureIndex == other.featureIndex && + isLeft == other.isLeft && categories == other.categories + case _ => false + } + + override private[tree] def toOld: OldSplit = { + val oldCats = if (isLeft) { + categories + } else { + setComplement(categories) + } + OldSplit(featureIndex, 0.0f, OldFeatureType.Categorical, oldCats.toList) + } + + /** Get sorted categories which split to the left */ + def leftCategories: Array[Float] = { + val cats = if (isLeft) categories else setComplement(categories) + cats.toArray.sorted + } + + /** Get sorted categories which split to the right */ + def rightCategories: Array[Float] = { + val cats = if (isLeft) setComplement(categories) else categories + cats.toArray.sorted + } + + /** [0, numCategories) \ cats */ + private def setComplement(cats: Set[Float]): Set[Float] = { + Range(0, numCategories).map(_.toFloat).filter(cat => !cats.contains(cat)).toSet + } +} /** - * Split with no acceptable feature values for categorical features. Helps with the first bin - * creation. - * @param feature feature index - * @param featureType type of feature -- categorical or continuous + * Split which tests a continuous feature. + * @param featureIndex Index of the feature to test + * @param threshold If the feature value is less than or equal to this threshold, then the + * split goes left. Otherwise, it goes right. */ -private[tree] class DummyCategoricalSplit(feature: Int, featureType: FeatureType) - extends Split(feature, Float.MaxValue, featureType, List()) +class ContinuousSplit private[tree] (override val featureIndex: Int, val threshold: Float) + extends Split { + override private[tree] def shouldGoLeft(features: IntFloatVector): Boolean = { + features.get(featureIndex) <= threshold + } + + override private[tree] def shouldGoLeft(binnedFeature: Int, splits: Array[Split]): Boolean = { + if (binnedFeature == splits.length) { + // > last split, so split right + false + } else { + val featureValueUpperBound = splits(binnedFeature).asInstanceOf[ContinuousSplit].threshold + featureValueUpperBound <= threshold + } + } + + override def equals(o: Any): Boolean = { + o match { + case other: ContinuousSplit => + featureIndex == other.featureIndex && threshold == other.threshold + case _ => + false + } + } + + override def hashCode(): Int = { + val state = Seq(featureIndex, threshold) + state.map(Objects.hashCode).foldLeft(0)((a, b) => 31 * a + b) + } + + override private[tree] def toOld: OldSplit = { + OldSplit(featureIndex, threshold, OldFeatureType.Continuous, List.empty[Float]) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala new file mode 100644 index 000000000..09f15e62f --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala @@ -0,0 +1,120 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.model.{ContinuousSplit, Split} +import org.apache.spark.ml.feature.LabeledPoint +import com.tencent.angel.ml.tree.model.{ContinuousSplit, Split} +import com.tencent.angel.ml.tree.model.{DecisionTreeMetadata, TreePoint} + +/** + * Internal representation of LabeledPoint for DecisionTree. + * This bins feature values based on a subsampled of data as follows: + * (a) Continuous features are binned into ranges. + * (b) Unordered categorical features are binned based on subsets of feature values. + * "Unordered categorical features" are categorical features with low arity used in + * multiclass classification. + * (c) Ordered categorical features are binned based on feature values. + * "Ordered categorical features" are categorical features with high arity, + * or any categorical feature used in regression or binary classification. + * + * @param label Label from LabeledPoint + * @param binnedFeatures Binned feature values. + * Same length as LabeledPoint.features, but values are bin indices. + */ +private[tree] class TreePoint(val label: Float, val binnedFeatures: Array[Int]) + extends Serializable { +} + +private[tree] object TreePoint { + + /** + * Convert an input dataset into its TreePoint representation, + * binning feature values in preparation for DecisionTree training. + * @param input Input dataset. + * @param splits Splits for features, of size (numFeatures, numSplits). + * @param metadata Learning and dataset metadata + * @return TreePoint dataset representation + */ + def convertToTreePoint( + input: Array[LabeledData], + splits: Array[Array[Split]], + metadata: DecisionTreeMetadata): Array[TreePoint] = { + // Construct arrays for featureArity for efficiency in the inner loop. + val featureArity: Array[Int] = new Array[Int](metadata.numFeatures) + var featureIndex = 0 + while (featureIndex < metadata.numFeatures) { + featureArity(featureIndex) = metadata.featureArity.getOrElse(featureIndex, 0) + featureIndex += 1 + } + val thresholds: Array[Array[Float]] = featureArity.zipWithIndex.map { case (arity, idx) => + if (arity == 0) { + splits(idx).map(_.asInstanceOf[ContinuousSplit].threshold) + } else { + Array.empty[Float] + } + } + input.map { x => + TreePoint.labeledPointToTreePoint(x, thresholds, featureArity) + } + } + + + /** + * Convert one LabeledPoint into its TreePoint representation. + * @param thresholds For each feature, split thresholds for continuous features, + * empty for categorical features. + * @param featureArity Array indexed by feature, with value 0 for continuous and numCategories + * for categorical features. + */ + private def labeledPointToTreePoint( + labeledPoint: LabeledData, + thresholds: Array[Array[Float]], + featureArity: Array[Int]): TreePoint = { + val numFeatures = labeledPoint.getX.dim().toInt + val arr = new Array[Int](numFeatures) + var featureIndex = 0 + while (featureIndex < numFeatures) { + arr(featureIndex) = + findBin(featureIndex, labeledPoint, featureArity(featureIndex), thresholds(featureIndex)) + featureIndex += 1 + } + new TreePoint(labeledPoint.getY.toFloat, arr) + } + + /** + * Find discretized value for one (labeledPoint, feature). + * + * NOTE: We cannot use Bucketizer since it handles split thresholds differently than the old + * (mllib) tree API. We want to maintain the same behavior as the old tree API. + * + * @param featureArity 0 for continuous features; number of categories for categorical features. + */ + private def findBin( + featureIndex: Int, + labeledPoint: LabeledData, + featureArity: Int, + thresholds: Array[Float]): Int = { + val featureValue = labeledPoint.getX.asInstanceOf[IntFloatVector].get(featureIndex) + + if (featureArity == 0) { + val idx = java.util.Arrays.binarySearch(thresholds, featureValue) + if (idx >= 0) { + idx + } else { + -idx - 1 + } + } else { + // Categorical feature bins are indexed by feature values. + if (featureValue < 0 || featureValue >= featureArity) { + throw new IllegalArgumentException( + s"DecisionTree given invalid data:" + + s" Feature $featureIndex is categorical with values in {0,...,${featureArity - 1}," + + s" but a data point gives it value $featureValue.\n" + + " Bad data point: " + labeledPoint.toString) + } + featureValue.toInt + } + } +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala index 103623882..565cae7f8 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala @@ -1,18 +1,16 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.oldmodel import java.text.DecimalFormat import scala.collection.mutable import scala.beans.BeanProperty - import org.apache.hadoop.conf.Configuration - import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.model.MLModel import com.tencent.angel.ml.predict.PredictResult import com.tencent.angel.ml.tree.conf.Algo._ -import com.tencent.angel.ml.tree.conf.{Algo, FeatureType} +import com.tencent.angel.ml.tree.conf.FeatureType import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} import com.tencent.angel.worker.task.TaskContext @@ -52,7 +50,7 @@ object DecisionTreeModel { featureType: Int, categories: Seq[Float]) { def toSplit: Split = { - new Split(feature, threshold, FeatureType(featureType), categories.toList) + Split(feature, threshold, FeatureType(featureType), categories.toList) } } @@ -116,7 +114,7 @@ object DecisionTreeModel { }.toList.sortBy(_._1) val numTrees = trees.length val treeIndices = trees.map(_._1) - assert(treeIndices == (0 until numTrees), + assert(treeIndices == (0 until numTrees).toList, s"Tree indices must start from 0 and increment by 1, but we found $treeIndices.") trees.map(_._2).toArray } @@ -167,7 +165,7 @@ object DecisionTreeModel { * @param topNode root node * @param algo algorithm type -- classification or regression */ -class DecisionTreeModel (@BeanProperty val topNode: Node, val algo: Algo, conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { +class DecisionTreeModel (@BeanProperty val topNode: Node, val algo: Algo, conf: Configuration = null, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { super.setSavePath(conf) super.setLoadPath(conf) @@ -181,7 +179,7 @@ class DecisionTreeModel (@BeanProperty val topNode: Node, val algo: Algo, conf: val y = instance.getY val pred = predict(x) - ret.put(new DecisionTreePredictResult(idx, y, pred)) + ret.put(DecisionTreePredictResult(idx, y, pred)) } ret diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala similarity index 98% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala index 46582c073..5cc62c65b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/InformationGainStats.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.oldmodel import com.tencent.angel.ml.tree.impurity.ImpurityCalculator diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala new file mode 100644 index 000000000..344a82708 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala @@ -0,0 +1,225 @@ +package com.tencent.angel.ml.tree.oldmodel + +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.tree.conf.FeatureType._ + +/** + * Node in a decision tree. + * + * About node indexing: + * Nodes are indexed from 1. Node 1 is the root; nodes 2, 3 are the left, right children. + * Node index 0 is not used. + * + * @param id integer node id, from 1 + * @param predict predicted value at the node + * @param impurity current node impurity + * @param isLeaf whether the node is a leaf + * @param split split to calculate left and right nodes + * @param leftNode left child + * @param rightNode right child + * @param stats information gain stats + */ +class Node ( + val id: Int, + var predict: Predict, + var impurity: Float, + var isLeaf: Boolean, + var split: Option[Split], + var leftNode: Option[Node], + var rightNode: Option[Node], + var stats: Option[InformationGainStats]) extends Serializable { + + override def toString: String = { + s"id = $id, isLeaf = $isLeaf, predict = $predict, impurity = $impurity, " + + s"split = $split, stats = $stats" + } + + /** + * predict value if node is not leaf + * @param features feature value + * @return predicted value + */ + def predict(features: IntFloatVector): Double = { + if (isLeaf) { + predict.predict + } else { + if (split.get.featureType == Continuous) { + if (features.get(split.get.feature) <= split.get.threshold) { + leftNode.get.predict(features) + } else { + rightNode.get.predict(features) + } + } else { + if (split.get.categories.contains(features.get(split.get.feature))) { + leftNode.get.predict(features) + } else { + rightNode.get.predict(features) + } + } + } + } + + /** + * Returns a deep copy of the subtree rooted at this node. + */ + def deepCopy(): Node = { + val leftNodeCopy = if (leftNode.isEmpty) { + None + } else { + Some(leftNode.get.deepCopy()) + } + val rightNodeCopy = if (rightNode.isEmpty) { + None + } else { + Some(rightNode.get.deepCopy()) + } + new Node(id, predict, impurity, isLeaf, split, leftNodeCopy, rightNodeCopy, stats) + } + + /** + * Get the number of nodes in tree below this node, including leaf nodes. + * E.g., if this is a leaf, returns 0. If both children are leaves, returns 2. + */ + def numDescendants: Int = if (isLeaf) { + 0 + } else { + 2 + leftNode.get.numDescendants + rightNode.get.numDescendants + } + + /** + * Get depth of tree from this node. + * E.g.: Depth 0 means this is a leaf node. + */ + def subtreeDepth: Int = if (isLeaf) { + 0 + } else { + 1 + math.max(leftNode.get.subtreeDepth, rightNode.get.subtreeDepth) + } + + /** + * Recursive print function. + * @param indentFactor The number of spaces to add to each level of indentation. + */ + def subtreeToString(indentFactor: Int = 0): String = { + + def splitToString(split: Split, left: Boolean): String = { + split.featureType match { + case Continuous => if (left) { + s"(feature ${split.feature} <= ${split.threshold})" + } else { + s"(feature ${split.feature} > ${split.threshold})" + } + case Categorical => if (left) { + s"(feature ${split.feature} in ${split.categories.mkString("{", ",", "}")})" + } else { + s"(feature ${split.feature} not in ${split.categories.mkString("{", ",", "}")})" + } + } + } + val prefix: String = " " * indentFactor + if (isLeaf) { + prefix + s"Predict: ${predict.predict}\n" + } else { + prefix + s"If ${splitToString(split.get, left = true)}\n" + + leftNode.get.subtreeToString(indentFactor + 1) + + prefix + s"Else ${splitToString(split.get, left = false)}\n" + + rightNode.get.subtreeToString(indentFactor + 1) + } + } + + /** Returns an iterator that traverses (DFS, left to right) the subtree of this node. */ + def subtreeIterator: Iterator[Node] = { + Iterator.single(this) ++ leftNode.map(_.subtreeIterator).getOrElse(Iterator.empty) ++ + rightNode.map(_.subtreeIterator).getOrElse(Iterator.empty) + } +} + +object Node { + + /** + * Return a node with the given node id (but nothing else set). + */ + def emptyNode(nodeIndex: Int): Node = new Node(nodeIndex, new Predict(Float.MinValue), -1.0f, + false, None, None, None, None) + + /** + * Construct a node with nodeIndex, predict, impurity and isLeaf parameters. + * This is used in `DecisionTree.findBestSplits` to construct child nodes + * after finding the best splits for parent nodes. + * Other fields are set at next level. + * @param nodeIndex integer node id, from 1 + * @param predict predicted value at the node + * @param impurity current node impurity + * @param isLeaf whether the node is a leaf + * @return new node instance + */ + def apply( + nodeIndex: Int, + predict: Predict, + impurity: Float, + isLeaf: Boolean): Node = { + new Node(nodeIndex, predict, impurity, isLeaf, None, None, None, None) + } + + /** + * Return the index of the left child of this node. + */ + def leftChildIndex(nodeIndex: Int): Int = nodeIndex << 1 + + /** + * Return the index of the right child of this node. + */ + def rightChildIndex(nodeIndex: Int): Int = (nodeIndex << 1) + 1 + + /** + * Get the parent index of the given node, or 0 if it is the root. + */ + def parentIndex(nodeIndex: Int): Int = nodeIndex >> 1 + + /** + * Return the level of a tree which the given node is in. + */ + def indexToLevel(nodeIndex: Int): Int = if (nodeIndex == 0) { + throw new IllegalArgumentException(s"0 is not a valid node index.") + } else { + java.lang.Integer.numberOfTrailingZeros(java.lang.Integer.highestOneBit(nodeIndex)) + } + + /** + * Returns true if this is a left child. + * Note: Returns false for the root. + */ + def isLeftChild(nodeIndex: Int): Boolean = nodeIndex > 1 && nodeIndex % 2 == 0 + + /** + * Return the maximum number of nodes which can be in the given level of the tree. + * @param level Level of tree (0 = root). + */ + def maxNodesInLevel(level: Int): Int = 1 << level + + /** + * Return the index of the first node in the given level. + * @param level Level of tree (0 = root). + */ + def startIndexInLevel(level: Int): Int = 1 << level + + /** + * Traces down from a root node to get the node with the given node index. + * This assumes the node exists. + */ + def getNode(nodeIndex: Int, rootNode: Node): Node = { + var tmpNode: Node = rootNode + var levelsToGo = indexToLevel(nodeIndex) + while (levelsToGo > 0) { + if ((nodeIndex & (1 << levelsToGo - 1)) == 0) { + tmpNode = tmpNode.leftNode.get + } else { + tmpNode = tmpNode.rightNode.get + } + levelsToGo -= 1 + } + tmpNode + } + +} + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Predict.scala similarity index 93% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Predict.scala index 56a8647e3..a04689304 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Predict.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Predict.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.oldmodel /** * Predicted value for a node diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Split.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Split.scala new file mode 100644 index 000000000..1b3b0e22d --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Split.scala @@ -0,0 +1,49 @@ +package com.tencent.angel.ml.tree.oldmodel + +import com.tencent.angel.ml.tree.conf.FeatureType.FeatureType + +/** + * Split applied to a feature + * @param feature feature index + * @param threshold Threshold for continuous feature. + * Split left if feature is less than or equal to threshold, else right. + * @param featureType type of feature -- categorical or continuous + * @param categories Split left if categorical feature value is in this set, else right. + */ +case class Split( + feature: Int, + threshold: Float, + featureType: FeatureType, + categories: List[Float]) { + + override def toString: String = { + s"Feature = $feature, threshold = $threshold, featureType = $featureType, " + + s"categories = $categories" + } +} + +/** + * Split with minimum threshold for continuous features. Helps with the smallest bin creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyLowSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MinValue, featureType, List()) + +/** + * Split with maximum threshold for continuous features. Helps with the highest bin creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyHighSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MaxValue, featureType, List()) + +/** + * Split with no acceptable feature values for categorical features. Helps with the first bin + * creation. + * @param feature feature index + * @param featureType type of feature -- categorical or continuous + */ +private[tree] class DummyCategoricalSplit(feature: Int, featureType: FeatureType) + extends Split(feature, Float.MaxValue, featureType, List()) + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala similarity index 89% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala index 1bd6cf23e..f12c7ca32 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModels.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala @@ -1,13 +1,13 @@ -package com.tencent.angel.ml.tree.model - -import scala.collection.mutable +package com.tencent.angel.ml.tree.oldmodel import org.apache.hadoop.conf.Configuration +import scala.collection.mutable import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.model.MLModel import com.tencent.angel.ml.predict.PredictResult import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.tree import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy._ import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} @@ -38,11 +38,11 @@ class RandomForestModel ( * @param combiningStrategy strategy for combining the predictions, not used for regression. */ sealed class TreeEnsembleModel( - protected val algo: Algo, - protected val trees: Array[DecisionTreeModel], - protected val treeWeights: Array[Double], - protected val combiningStrategy: EnsembleCombiningStrategy, - conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { + protected val algo: Algo, + protected val trees: Array[DecisionTreeModel], + protected val treeWeights: Array[Double], + protected val combiningStrategy: EnsembleCombiningStrategy, + conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") @@ -60,7 +60,7 @@ sealed class TreeEnsembleModel( val y = instance.getY val pred = predict(x) - ret.put(new DecisionTreePredictResult(idx, y, pred)) + ret.put(DecisionTreePredictResult(idx, y, pred)) } ret @@ -166,7 +166,7 @@ object TreeEnsembleModel { object SaveUtils { - import com.tencent.angel.ml.tree.model.DecisionTreeModel.DataStruct.{NodeData, constructTrees} + import com.tencent.angel.ml.tree.oldmodel.DecisionTreeModel.DataStruct.{NodeData, constructTrees} case class Metadata( algo: String, @@ -198,7 +198,7 @@ object TreeEnsembleModel { */ def loadTrees( path: String, - treeAlgo: String): Array[DecisionTreeModel] = ??? + treeAlgo: String): Array[tree.DecisionTreeModel] = ??? } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/SamplingUtils.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/SamplingUtils.scala new file mode 100644 index 000000000..5f9332c1f --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/SamplingUtils.scala @@ -0,0 +1,151 @@ +package com.tencent.angel.ml.tree.utils + +import scala.reflect.ClassTag +import scala.util.Random + +object SamplingUtils { + + /** + * Reservoir sampling implementation that also returns the input size. + * + * @param input input size + * @param k reservoir size + * @param seed random seed + * @return (samples, input size) + */ + def reservoirSampleAndCount[T: ClassTag]( + input: Iterator[T], + k: Int, + seed: Long = Random.nextLong()): (Array[T], Long) = { + val reservoir = new Array[T](k) + // Put the first k elements in the reservoir. + var i = 0 + while (i < k && input.hasNext) { + val item = input.next() + reservoir(i) = item + i += 1 + } + + // If we have consumed all the elements, return them. Otherwise do the replacement. + if (i < k) { + // If input size < k, trim the array to return only an array of input size. + val trimReservoir = new Array[T](i) + System.arraycopy(reservoir, 0, trimReservoir, 0, i) + (trimReservoir, i) + } else { + // If input size > k, continue the sampling process. + var l = i.toLong + val rand = new XORShiftRandom(seed) + while (input.hasNext) { + val item = input.next() + l += 1 + // There are k elements in the reservoir, and the l-th element has been + // consumed. It should be chosen with probability k/l. The expression + // below is a random long chosen uniformly from [0,l) + val replacementIndex = (rand.nextDouble() * l).toLong + if (replacementIndex < k) { + reservoir(replacementIndex.toInt) = item + } + } + (reservoir, l) + } + } + + /** + * Returns a sampling rate that guarantees a sample of size greater than or equal to + * sampleSizeLowerBound 99.99% of the time. + * + * How the sampling rate is determined: + * + * Let p = num / total, where num is the sample size and total is the total number of + * datapoints in the RDD. We're trying to compute q {@literal >} p such that + * - when sampling with replacement, we're drawing each datapoint with prob_i ~ Pois(q), + * where we want to guarantee + * Pr[s {@literal <} num] {@literal <} 0.0001 for s = sum(prob_i for i from 0 to total), + * i.e. the failure rate of not having a sufficiently large sample {@literal <} 0.0001. + * Setting q = p + 5 * sqrt(p/total) is sufficient to guarantee 0.9999 success rate for + * num {@literal >} 12, but we need a slightly larger q (9 empirically determined). + * - when sampling without replacement, we're drawing each datapoint with prob_i + * ~ Binomial(total, fraction) and our choice of q guarantees 1-delta, or 0.9999 success + * rate, where success rate is defined the same as in sampling with replacement. + * + * The smallest sampling rate supported is 1e-10 (in order to avoid running into the limit of the + * RNG's resolution). + * + * @param sampleSizeLowerBound sample size + * @param total size of RDD + * @param withReplacement whether sampling with replacement + * @return a sampling rate that guarantees sufficient sample size with 99.99% success rate + */ + def computeFractionForSampleSize(sampleSizeLowerBound: Int, total: Long, + withReplacement: Boolean): Double = { + if (withReplacement) { + PoissonBounds.getUpperBound(sampleSizeLowerBound) / total + } else { + val fraction = sampleSizeLowerBound.toDouble / total + BinomialBounds.getUpperBound(1e-4, total, fraction) + } + } +} + +/** + * Utility functions that help us determine bounds on adjusted sampling rate to guarantee exact + * sample sizes with high confidence when sampling with replacement. + */ +object PoissonBounds { + + /** + * Returns a lambda such that Pr[X {@literal >} s] is very small, where X ~ Pois(lambda). + */ + def getLowerBound(s: Double): Double = { + math.max(s - numStd(s) * math.sqrt(s), 1e-15) + } + + /** + * Returns a lambda such that Pr[X {@literal <} s] is very small, where X ~ Pois(lambda). + * + * @param s sample size + */ + def getUpperBound(s: Double): Double = { + math.max(s + numStd(s) * math.sqrt(s), 1e-10) + } + + private def numStd(s: Double): Double = { + // TODO: Make it tighter. + if (s < 6.0) { + 12.0 + } else if (s < 16.0) { + 9.0 + } else { + 6.0 + } + } +} + +/** + * Utility functions that help us determine bounds on adjusted sampling rate to guarantee exact + * sample size with high confidence when sampling without replacement. + */ +object BinomialBounds { + + val minSamplingRate = 1e-10 + + /** + * Returns a threshold `p` such that if we conduct n Bernoulli trials with success rate = `p`, + * it is very unlikely to have more than `fraction * n` successes. + */ + def getLowerBound(delta: Double, n: Long, fraction: Double): Double = { + val gamma = - math.log(delta) / n * (2.0 / 3.0) + fraction + gamma - math.sqrt(gamma * gamma + 3 * gamma * fraction) + } + + /** + * Returns a threshold `p` such that if we conduct n Bernoulli trials with success rate = `p`, + * it is very unlikely to have less than `fraction * n` successes. + */ + def getUpperBound(delta: Double, n: Long, fraction: Double): Double = { + val gamma = - math.log(delta) / n + math.min(1, + math.max(minSamplingRate, fraction + gamma + math.sqrt(gamma * gamma + 2 * gamma * fraction))) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/TimeTracker.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/TimeTracker.scala new file mode 100644 index 000000000..202761b9f --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/TimeTracker.scala @@ -0,0 +1,53 @@ +package com.tencent.angel.ml.tree.utils + +import scala.collection.mutable.{HashMap => MutableHashMap} + +/** + * Time tracker implementation which holds labeled timers. + */ +class TimeTracker extends Serializable { + + private val starts: MutableHashMap[String, Long] = new MutableHashMap[String, Long]() + + private val totals: MutableHashMap[String, Long] = new MutableHashMap[String, Long]() + + /** + * Starts a new timer, or re-starts a stopped timer. + */ + def start(timerLabel: String): Unit = { + val currentTime = System.nanoTime() + if (starts.contains(timerLabel)) { + throw new RuntimeException(s"TimeTracker.start(timerLabel) called again on" + + s" timerLabel = $timerLabel before that timer was stopped.") + } + starts(timerLabel) = currentTime + } + + /** + * Stops a timer and returns the elapsed time in seconds. + */ + def stop(timerLabel: String): Double = { + val currentTime = System.nanoTime() + if (!starts.contains(timerLabel)) { + throw new RuntimeException(s"TimeTracker.stop(timerLabel) called on" + + s" timerLabel = $timerLabel, but that timer was not started.") + } + val elapsed = currentTime - starts(timerLabel) + starts.remove(timerLabel) + if (totals.contains(timerLabel)) { + totals(timerLabel) += elapsed + } else { + totals(timerLabel) = elapsed + } + elapsed / 1e9 + } + + /** + * Print all timing results in seconds. + */ + override def toString: String = { + totals.map { case (label, elapsed) => + s" $label: ${elapsed / 1e9}" + }.mkString("\n") + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/XORShiftRandom.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/XORShiftRandom.scala new file mode 100644 index 000000000..0bf2a02ea --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/XORShiftRandom.scala @@ -0,0 +1,51 @@ +package com.tencent.angel.ml.tree.utils + +import java.nio.ByteBuffer +import java.util.{Random => JavaRandom} + +import scala.util.hashing.MurmurHash3 + +/** + * This class implements a XORShift random number generator algorithm + * Source: + * Marsaglia, G. (2003). Xorshift RNGs. Journal of Statistical Software, Vol. 8, Issue 14. + * @see Paper + * This implementation is approximately 3.5 times faster than + * {@link java.util.Random java.util.Random}, partly because of the algorithm, but also due + * to renouncing thread safety. JDK's implementation uses an AtomicLong seed, this class + * uses a regular Long. We can forgo thread safety since we use a new instance of the RNG + * for each thread. + */ +class XORShiftRandom(init: Long) extends JavaRandom(init) { + + def this() = this(System.nanoTime) + + private var seed = XORShiftRandom.hashSeed(init) + + // we need to just override next - this will be called by nextInt, nextDouble, + // nextGaussian, nextLong, etc. + override protected def next(bits: Int): Int = { + var nextSeed = seed ^ (seed << 21) + nextSeed ^= (nextSeed >>> 35) + nextSeed ^= (nextSeed << 4) + seed = nextSeed + (nextSeed & ((1L << bits) -1)).asInstanceOf[Int] + } + + override def setSeed(s: Long) { + seed = XORShiftRandom.hashSeed(s) + } +} + +/** Contains benchmark method and main method to run benchmark of the RNG */ +object XORShiftRandom { + + /** Hash seeds to have 0/1 bits throughout. */ + private def hashSeed(seed: Long): Long = { + val bytes = ByteBuffer.allocate(java.lang.Long.SIZE).putLong(seed).array() + val lowBits = MurmurHash3.bytesHash(bytes) + val highBits = MurmurHash3.bytesHash(bytes, lowBits) + (highBits.toLong << 32) | (lowBits.toLong & 0xFFFFFFFFL) + } + +} From 2befb1210d0188a4f744ac9c21d53d3d099c9341 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 15 Nov 2018 18:19:56 +0800 Subject: [PATCH 005/115] format code --- .../com/tencent/angel/ml/tree/conf/Algo.scala | 18 +++++++ .../angel/ml/tree/conf/BoostingStrategy.scala | 32 ++++++++--- .../tree/conf/EnsembleCombiningStrategy.scala | 20 +++++++ .../angel/ml/tree/conf/FeatureType.scala | 20 +++++++ .../angel/ml/tree/conf/QuantileStrategy.scala | 20 +++++++ .../tencent/angel/ml/tree/conf/Strategy.scala | 54 ++++++++++++++----- 6 files changed, 145 insertions(+), 19 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala index 44896cb53..2b1aa513f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Algo.scala @@ -1,3 +1,21 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala index 477699fee..beae4fb9c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/BoostingStrategy.scala @@ -1,3 +1,21 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf import com.tencent.angel.ml.tree.conf.Algo._ @@ -26,10 +44,13 @@ import com.tencent.angel.ml.tree.loss.{LogLoss, Loss, SquaredError} * `org.apache.spark.mllib.tree.GradientBoostedTrees.run()` is used. */ case class BoostingStrategy ( - // Required boosting parameters - var treeStrategy: Strategy, var loss: Loss, - // Optional boosting parameters - var numIterations: Int = 100, var learningRate: Double = 0.1f, var validationTol: Double = 0.01) extends Serializable { + // Required boosting parameters + var treeStrategy: Strategy, + var loss: Loss, + // Optional boosting parameters + var numIterations: Int = 100, + var learningRate: Double = 0.1, + var validationTol: Double = 0.01) extends Serializable { /** * Check validity of parameters. @@ -83,5 +104,4 @@ object BoostingStrategy { throw new IllegalArgumentException(s"$algo is not supported by boosting.") } } -} - +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala index b493d9577..8a7ee590c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala @@ -1,10 +1,30 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf /** * Enum to select ensemble combining strategy for base learners */ object EnsembleCombiningStrategy extends Enumeration { + type EnsembleCombiningStrategy = Value + val Average, Sum, Vote = Value } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala index f5eff7b5c..cb4a95b85 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/FeatureType.scala @@ -1,9 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf /** * Enum to describe whether a feature is "continuous" or "categorical" */ object FeatureType extends Enumeration { + type FeatureType = Value + val Continuous, Categorical = Value } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala index 0b05d3cf7..53eacc795 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala @@ -1,9 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf /** * Enum for selecting the quantile calculation strategy */ object QuantileStrategy extends Enumeration { + type QuantileStrategy = Value + val Sort, MinMax, ApproxHist = Value } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index 4cc32a69e..b060cce37 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -1,3 +1,21 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.ml.tree.conf import scala.beans.BeanProperty @@ -11,22 +29,32 @@ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} * Stores all the configuration options for tree construction * @param algo Learning goal. Supported: Classification, Regression * @param impurity Criterion used for information gain calculation. - * Supported for Classification: Gini, Entropy. Supported for Regression: Variance - * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, depth 1 means 1 internal node + 2 leaf nodes). - * @param numClasses Number of classes for classification. (Ignored for regression.) Default value is 2 (binary classification). - * @param maxBins Maximum number of bins used for discretizing continuous features and for choosing how to split on features at each node. - * @param quantileCalculationStrategy Algorithm for calculating quantiles. Supported: QuantileStrategy.Sort` - * @param categoricalFeaturesInfo A map storing information about the categorical variables and the number of discrete values they take. - * An entry (n to k) indicates that feature n is categorical with k categories indexed from 0: {0, 1, ..., k-1}. - * @param minInstancesPerNode Minimum number of instances each child must have after split. - * Default value is 1. If a split cause left or right child to have less than minInstancesPerNode, this split will not be considered as a valid split. + * Supported for Classification: Gini, Entropy. Supported for Regression: Variance + * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, + * depth 1 means 1 internal node + 2 leaf nodes). + * @param numClasses Number of classes for classification. (Ignored for regression.) + * Default value is 2 (binary classification). + * @param maxBins Maximum number of bins used for discretizing continuous features and + * for choosing how to split on features at each node. + * @param quantileCalculationStrategy Algorithm for calculating quantiles. + * Supported: QuantileStrategy.Sort + * @param categoricalFeaturesInfo A map storing information about the categorical variables + * and the number of discrete values they take. An entry (n to k) indicates that + * feature n is categorical with k categories indexed from 0: {0, 1, ..., k-1}. + * @param minInstancesPerNode Minimum number of instances each child must have after split. Default value is 1. + * If a split cause left or right child to have less than minInstancesPerNode, + * this split will not be considered as a valid split. * @param minInfoGain Minimum information gain a split must get. Default value is 0.0. - * If a split has less information gain than minInfoGain, this split will not be considered as a valid split. + * If a split has less information gain than minInfoGain, + * this split will not be considered as a valid split. * @param maxMemoryInMB Maximum memory in MB allocated to histogram aggregation. Default value is 256 MB. - * If too small, then 1 node will be split per iteration, and its aggregates may exceed this size. + * If too small, then 1 node will be split per iteration, + * nd its aggregates may exceed this size. * @param subsamplingRate Fraction of the training data used for learning decision tree. - * @param useNodeIdCache If this is true, instead of passing trees to executors, the algorithm will maintain a separate RDD of node Id cache for each row. - * @param checkpointInterval How often to checkpoint when the node Id cache gets updated. E.g. 10 means that the cache will get checkpointed every 10 update. + * @param useNodeIdCache If this is true, instead of passing trees to executors, + * the algorithm will maintain a separate RDD of node Id cache for each row. + * @param checkpointInterval How often to checkpoint when the node Id cache gets updated. + * E.g. 10 means that the cache will get checkpointed every 10 update. */ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impurity, From 8eeecc936ce3e7bc8d4a219423e946ce29c49828 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 16 Nov 2018 17:52:17 +0800 Subject: [PATCH 006/115] RFLearner, refine strategy, add MLConf --- .../angel/example/ml/GBDTLocalExample.java | 6 +- .../tencent/angel/ml/GBDT/GBDTLearner.scala | 8 +- .../com/tencent/angel/ml/GBDT/GBDTModel.scala | 6 +- .../angel/ml/GBDT/algo/GBDTController.java | 2 +- .../ml/GBDT/algo/RegTree/GradHistHelper.java | 4 +- .../angel/ml/GBDT/param/RegTParam.java | 4 +- .../tencent/angel/ml/core/conf/MLConf.scala | 28 ++-- .../angel/ml/tree/RandomForestLearner.scala | 86 +++------- .../ml/tree/RandomForestPredictTask.scala | 17 ++ .../angel/ml/tree/RandomForestTrainTask.scala | 64 ++++++++ .../tencent/angel/ml/tree/TreeModels.scala | 4 +- .../tencent/angel/ml/tree/conf/Strategy.scala | 42 ++++- .../DecisionTreeClassificationModel.scala | 3 +- .../ml/tree/model/DecisionTreeMetadata.scala | 23 +-- .../angel/ml/tree/model/RandomForest.scala | 12 +- .../ml/tree/model/TreeEnsembleModel.scala | 147 ++++++++++++++++++ .../ml/tree/oldmodel/TreeEnsembleModels.scala | 9 +- .../ProbabilisticUtils.scala} | 6 +- .../ml/tree/utils/RandomForestRunner.scala | 49 ++++++ .../com/tencent/angel/ml/gbdt/GBDTTest.java | 8 +- 20 files changed, 382 insertions(+), 146 deletions(-) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestTrainTask.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model/ProbabilisticClassificationModel.scala => utils/ProbabilisticUtils.scala} (91%) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala diff --git a/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java b/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java index d6e4a8bbd..cc01a6d31 100644 --- a/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java +++ b/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java @@ -114,9 +114,9 @@ public void setConf(int mode) { // Set GBDT algorithm parameters conf.set(MLConf.ML_FEATURE_INDEX_RANGE(), String.valueOf(featureNum)); - conf.set(MLConf.ML_GBDT_TREE_NUM(), String.valueOf(treeNum)); - conf.set(MLConf.ML_GBDT_TREE_DEPTH(), String.valueOf(treeDepth)); - conf.set(MLConf.ML_GBDT_SPLIT_NUM(), String.valueOf(splitNum)); + conf.set(MLConf.ML_NUM_TREE(), String.valueOf(treeNum)); + conf.set(MLConf.ML_TREE_MAX_DEPTH(), String.valueOf(treeDepth)); + conf.set(MLConf.ML_TREE_MAX_BIN(), String.valueOf(splitNum)); conf.set(MLConf.ML_VALIDATE_RATIO(), String.valueOf(validateRatio)); conf.set(MLConf.ML_GBDT_SAMPLE_RATIO(), String.valueOf(sampleRatio)); conf.set(MLConf.ML_LEARN_RATE(), String.valueOf(learnRate)); diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala index 21d8f67f6..700992eb3 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala @@ -42,12 +42,12 @@ class GBDTLearner(override val ctx: TaskContext) extends MLLearner(ctx) { def initParam(): Unit = { // 1. set training param - param.taskType = conf.get(MLConf.ML_GBDT_TASK_TYPE, MLConf.DEFAULT_ML_GBDT_TASK_TYPE) + param.taskType = conf.get(MLConf.ML_TREE_TASK_TYPE, MLConf.DEFAULT_ML_TREE_TASK_TYPE) param.numFeature = conf.getInt(MLConf.ML_FEATURE_INDEX_RANGE, MLConf.DEFAULT_ML_FEATURE_INDEX_RANGE) param.numNonzero = conf.getInt(MLConf.ML_MODEL_SIZE, MLConf.DEFAULT_ML_MODEL_SIZE) - param.numSplit = conf.getInt(MLConf.ML_GBDT_SPLIT_NUM, MLConf.DEFAULT_ML_GBDT_SPLIT_NUM) - param.treeNum = conf.getInt(MLConf.ML_GBDT_TREE_NUM, MLConf.DEFAULT_ML_GBDT_TREE_NUM) - param.maxDepth = conf.getInt(MLConf.ML_GBDT_TREE_DEPTH, MLConf.DEFAULT_ML_GBDT_TREE_DEPTH) + param.numSplit = conf.getInt(MLConf.ML_TREE_MAX_BIN, MLConf.DEFAULT_ML_TREE_MAX_BIN) + param.treeNum = conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE) + param.maxDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_DEPTH) param.colSample = conf.getFloat(MLConf.ML_GBDT_SAMPLE_RATIO, MLConf.DEFAULT_ML_GBDT_SAMPLE_RATIO) param.learningRate = conf.getFloat(MLConf.ML_LEARN_RATE, MLConf.DEFAULT_ML_LEARN_RATE.asInstanceOf[Float]) param.maxThreadNum = conf.getInt(MLConf.ML_GBDT_THREAD_NUM, MLConf.DEFAULT_ML_GBDT_THREAD_NUM) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala index 451a6217c..31a3d000b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala @@ -61,9 +61,9 @@ class GBDTModel(conf: Configuration, _ctx: TaskContext = null) extends MLModel(c var LOG = LogFactory.getLog(classOf[GBDTModel]) var indexRange = conf.getInt(MLConf.ML_FEATURE_INDEX_RANGE, MLConf.DEFAULT_ML_FEATURE_INDEX_RANGE) - val maxTreeNum = conf.getInt(MLConf.ML_GBDT_TREE_NUM, MLConf.DEFAULT_ML_GBDT_TREE_NUM) - val maxTreeDepth = conf.getInt(MLConf.ML_GBDT_TREE_DEPTH, MLConf.DEFAULT_ML_GBDT_TREE_DEPTH) - val splitNum = conf.getInt(MLConf.ML_GBDT_SPLIT_NUM, MLConf.DEFAULT_ML_GBDT_SPLIT_NUM) + val maxTreeNum = conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE) + val maxTreeDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_DEPTH) + val splitNum = conf.getInt(MLConf.ML_TREE_MAX_BIN, MLConf.DEFAULT_ML_TREE_MAX_BIN) val featSampleRatio = conf.getFloat(MLConf.ML_GBDT_SAMPLE_RATIO, MLConf.DEFAULT_ML_GBDT_SAMPLE_RATIO) val cateFeatStr = conf.get(MLConf.ML_GBDT_CATE_FEAT, MLConf.DEFAULT_ML_GBDT_CATE_FEAT) val cateFeatNum = if (cateFeatStr.contains(",")) cateFeatStr.split(",").length else 1 diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java index 5843e0653..756c859a8 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java @@ -630,7 +630,7 @@ public void findSplit() throws Exception { boolean isServerSplit = taskContext.getConf() .getBoolean(MLConf.ML_GBDT_SERVER_SPLIT(), MLConf.DEFAULT_ML_GBDT_SERVER_SPLIT()); int splitNum = - taskContext.getConf().getInt(MLConf.ML_GBDT_SPLIT_NUM(), MLConf.DEFAULT_ML_GBDT_SPLIT_NUM()); + taskContext.getConf().getInt(MLConf.ML_TREE_MAX_BIN(), MLConf.DEFAULT_ML_TREE_MAX_BIN()); for (int i = 0; i < tNodeId.length; i++) { int nid = tNodeId[i]; diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/RegTree/GradHistHelper.java b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/RegTree/GradHistHelper.java index 824970724..493fc8fdd 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/RegTree/GradHistHelper.java +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/RegTree/GradHistHelper.java @@ -411,7 +411,7 @@ public static SplitEntry findBestSplitHelper(IntDoubleVector histogram) int featureNum = WorkerContext.get().getConf() .getInt(MLConf.ML_FEATURE_INDEX_RANGE(), MLConf.DEFAULT_ML_FEATURE_INDEX_RANGE()); int splitNum = WorkerContext.get().getConf() - .getInt(MLConf.ML_GBDT_SPLIT_NUM(), MLConf.DEFAULT_ML_GBDT_SPLIT_NUM()); + .getInt(MLConf.ML_TREE_MAX_BIN(), MLConf.DEFAULT_ML_TREE_MAX_BIN()); if (histogram.getDim() != featureNum * 2 * splitNum) { LOG.debug("The size of histogram is not equal to 2 * featureNum*splitNum."); @@ -441,7 +441,7 @@ public static SplitEntry findBestSplitOfOneFeatureHelper(int fid, IntDoubleVecto histogram.getDim(), startIdx)); int splitNum = WorkerContext.get().getConf() - .getInt(MLConf.ML_GBDT_SPLIT_NUM(), MLConf.DEFAULT_ML_GBDT_SPLIT_NUM()); + .getInt(MLConf.ML_TREE_MAX_BIN(), MLConf.DEFAULT_ML_TREE_MAX_BIN()); SplitEntry splitEntry = new SplitEntry(); // 1. set the feature id diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java index b76e31482..afa395040 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java @@ -37,13 +37,13 @@ public class RegTParam implements TrainParam { // minimum loss change required for a split public float minSplitLoss = 0; // maximum depth of a tree - public int maxDepth = MLConf.DEFAULT_ML_GBDT_TREE_DEPTH(); + public int maxDepth = MLConf.DEFAULT_ML_TREE_DEPTH(); // number of features public int numFeature; // number of nonzero public int numNonzero; // number of candidates split value - public int numSplit = MLConf.DEFAULT_ML_GBDT_SPLIT_NUM(); + public int numSplit = MLConf.DEFAULT_ML_TREE_MAX_BIN(); // ----- the rest parameters are less important ---- // base instance weight public float baseWeight = 0; diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 2d501bb00..948668eaf 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -157,22 +157,18 @@ object MLConf { val KMEANS_C = "ml.kmeans.c" val DEFAULT_KMEANS_C = 0.1 - // GBDT Params - val ML_GBDT_TASK_TYPE = "ml.gbdt.task.type" - val DEFAULT_ML_GBDT_TASK_TYPE = "classification" - val ML_GBDT_CLASS_NUM = "ml.gbdt.class.num" - val DEFAULT_ML_GBDT_CLASS_NUM = 2 - val ML_GBDT_PARALLEL_MODE = "ml.gbdt.parallel.mode" - val DEFAULT_ML_GBDT_PARALLEL_MODE = "data" - val ML_GBDT_TREE_NUM = "ml.gbdt.tree.num" - val DEFAULT_ML_GBDT_TREE_NUM = 10 - val ML_GBDT_TREE_DEPTH = "ml.gbdt.tree.depth" - val DEFAULT_ML_GBDT_TREE_DEPTH = 5 - val ML_GBDT_MAX_NODE_NUM = "ml.gbdt.max.node.num" - val ML_GBDT_SPLIT_NUM = "ml.gbdt.split.num" - val DEFAULT_ML_GBDT_SPLIT_NUM = 5 - val ML_GBDT_ROW_SAMPLE_RATIO = "ml.gbdt.row.sample.ratio" - val DEFAULT_ML_GBDT_ROW_SAMPLE_RATIO = 1 + // Tree Model Params + val ML_TREE_TASK_TYPE = "ml.tree.task.type" + val DEFAULT_ML_TREE_TASK_TYPE = "classification" + val ML_PARALLEL_MODE = "ml.parallel.mode" + val DEFAULT_ML_PARALLEL_MODE = "data" + val ML_NUM_TREE = "ml.num.tree" + val DEFAULT_ML_NUM_TREE = 10 + val ML_TREE_MAX_DEPTH = "ml.tree.max.depth" + val DEFAULT_ML_TREE_DEPTH = 2 + val ML_TREE_MAX_NODE_NUM = "ml.tree.max.node.num" + val ML_TREE_MAX_BIN = "ml.tree.max.num" + val DEFAULT_ML_TREE_MAX_BIN = 3 val ML_GBDT_SAMPLE_RATIO = "ml.gbdt.sample.ratio" val DEFAULT_ML_GBDT_SAMPLE_RATIO = 1 val ML_GBDT_MIN_CHILD_WEIGHT = "ml.gbdt.min.child.weight" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index 052a694a7..e5d585b07 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -4,9 +4,7 @@ import com.tencent.angel.ml.core.MLLearner import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel -import scala.util.Try import scala.util.Random -import com.tencent.angel.ml.tree.{TreeEnsembleParams => NewRFParams} import com.tencent.angel.ml.tree.model.{RandomForest => NewRandomForest} import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ @@ -36,42 +34,20 @@ import scala.collection.mutable.ArrayBuffer * the type of random forest (classification or regression), feature type * (continuous, categorical), depth of the tree, quantile calculation strategy, * etc. - * @param numTrees If 1, then no bootstrapping is used. If greater than 1, then bootstrapping is - * done. - * @param featureSubsetStrategy Number of features to consider for splits at each node. - * Supported values: "auto", "all", "sqrt", "log2", "onethird". - * Supported numerical values: "(0.0-1.0]", "[1-n]". - * If "auto" is set, this parameter is set based on numTrees: - * if numTrees == 1, set to "all"; - * if numTrees is greater than 1 (forest) set to "sqrt" for - * classification and to "onethird" for regression. - * If a real value "n" in the range (0, 1.0] is set, - * use n * number of features. - * If an integer value "n" in the range (1, num features) is set, - * use n features. * @param seed Random seed for bootstrapping and choosing feature subsets. */ class RandomForestLearner ( override val ctx: TaskContext, val strategy: Strategy, - val numTrees: Int, - featureSubsetStrategy: String, val seed: Int) extends MLLearner(ctx) { strategy.assertValid() - require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") - require(RandomForestLearner.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) - || Try(featureSubsetStrategy.toInt).filter(_ > 0).isSuccess - || Try(featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, - s"RandomForest given invalid featureSubsetStrategy: $featureSubsetStrategy." + - s" Supported values: ${NewRFParams.supportedFeatureSubsetStrategies.mkString(", ")}," + - s" (0.0-1.0], [1-n].") private[tree] def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { input.resetReadIndex() val ret = new ArrayBuffer[LabeledData] - (0 until input.size()).foreach{ + (0 until input.size()).foreach{ idx => ret += input.read() } ret.toArray @@ -85,10 +61,9 @@ class RandomForestLearner ( */ override def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { - var trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) - var validDataSet: Array[LabeledData] = convertDataBlock(validBlock) - val trees: Array[DecisionTreeModel] = NewRandomForest.train(trainDataSet, validDataSet, strategy, numTrees, - featureSubsetStrategy, seed.toLong) + val trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) + val validDataSet: Array[LabeledData] = convertDataBlock(validBlock) + val trees: Array[DecisionTreeModel] = NewRandomForest.train(trainDataSet, validDataSet, strategy, seed.toLong) new RandomForestModel(strategy.algo, trees.map(_.toOld), ctx.getConf, ctx) } @@ -102,12 +77,6 @@ object RandomForestLearner { * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels should take values {0, 1, ..., numClasses-1}. * @param strategy Parameters for training each tree in the forest. - * @param numTrees Number of trees in the random forest. - * @param featureSubsetStrategy Number of features to consider for splits at each node. - * Supported values: "auto", "all", "sqrt", "log2", "onethird". - * If "auto" is set, this parameter is set based on numTrees: - * if numTrees == 1, set to "all"; - * if numTrees is greater than 1 (forest) set to "sqrt". * @param seed Random seed for bootstrapping and choosing feature subsets. * @return MLModel that can be used for prediction. */ @@ -116,12 +85,10 @@ object RandomForestLearner { trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData], strategy: Strategy, - numTrees: Int, - featureSubsetStrategy: String, seed: Int): MLModel = { require(strategy.algo == Classification, s"RandomForest.trainClassifier given Strategy with invalid algo: ${strategy.algo}") - val rf = new RandomForestLearner(ctx, strategy, numTrees, featureSubsetStrategy, seed) + val rf = new RandomForestLearner(ctx, strategy, seed) rf.train(trainBlock, validBlock) } @@ -154,18 +121,19 @@ object RandomForestLearner { ctx: TaskContext, trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData], - numClasses: Int, - categoricalFeaturesInfo: Map[Int, Int], - numTrees: Int, - featureSubsetStrategy: String, impurity: String, + numTrees: Int, maxDepth: Int, + numClasses: Int, maxBins: Int, + subsamplingRate: Double, + featureSubsetStrategy: String, + categoricalFeaturesInfo: Map[Int, Int], seed: Int = Random.nextInt()): MLModel = { val impurityType = Impurities.fromString(impurity) - val strategy = new Strategy(Classification, impurityType, maxDepth, - numClasses, maxBins, Sort, categoricalFeaturesInfo) - trainClassifier(ctx, trainBlock, validBlock, strategy, numTrees, featureSubsetStrategy, seed) + val strategy = new Strategy(Classification, impurityType, numTrees, maxDepth, + numClasses, maxBins, subsamplingRate, featureSubsetStrategy, Sort, categoricalFeaturesInfo) + trainClassifier(ctx, trainBlock, validBlock, strategy, seed) } /** @@ -174,12 +142,6 @@ object RandomForestLearner { * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels are real numbers. * @param strategy Parameters for training each tree in the forest. - * @param numTrees Number of trees in the random forest. - * @param featureSubsetStrategy Number of features to consider for splits at each node. - * Supported values: "auto", "all", "sqrt", "log2", "onethird". - * If "auto" is set, this parameter is set based on numTrees: - * if numTrees == 1, set to "all"; - * if numTrees is greater than 1 (forest) set to "onethird". * @param seed Random seed for bootstrapping and choosing feature subsets. * @return MLModel that can be used for prediction. */ @@ -188,12 +150,10 @@ object RandomForestLearner { trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData], strategy: Strategy, - numTrees: Int, - featureSubsetStrategy: String, seed: Int): MLModel = { require(strategy.algo == Regression, s"RandomForest.trainRegressor given Strategy with invalid algo: ${strategy.algo}") - val rf = new RandomForestLearner(ctx, strategy, numTrees, featureSubsetStrategy, seed) + val rf = new RandomForestLearner(ctx, strategy, seed) rf.train(trainBlock, validBlock) } @@ -225,22 +185,18 @@ object RandomForestLearner { ctx: TaskContext, trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData], - categoricalFeaturesInfo: Map[Int, Int], - numTrees: Int, - featureSubsetStrategy: String, impurity: String, + numTrees: Int, maxDepth: Int, maxBins: Int, + subsamplingRate: Double = 1, + featureSubsetStrategy: String, + categoricalFeaturesInfo: Map[Int, Int], seed: Int = Random.nextInt()): MLModel = { val impurityType = Impurities.fromString(impurity) - val strategy = new Strategy(Regression, impurityType, maxDepth, - 0, maxBins, Sort, categoricalFeaturesInfo) - trainRegressor(ctx, trainBlock, validBlock, strategy, numTrees, featureSubsetStrategy, seed) + val strategy = new Strategy(Regression, impurityType, numTrees, maxDepth, + 0, maxBins, subsamplingRate, featureSubsetStrategy, Sort, categoricalFeaturesInfo) + trainRegressor(ctx, trainBlock, validBlock, strategy, seed) } - - /** - * List of supported feature subset sampling strategies. - */ - val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala new file mode 100644 index 000000000..c23971be8 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala @@ -0,0 +1,17 @@ +package com.tencent.angel.ml.tree + +import com.tencent.angel.ml.core.PredictTask +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.io.{LongWritable, Text} + +class RandomForestPredictTask (ctx: TaskContext) extends PredictTask[LongWritable, Text](ctx) { + + def predict(ctx: TaskContext) { + predict(ctx, RandomForestModel(ctx, conf), taskDataBlock); + } + + def parse(key: LongWritable, value: Text): LabeledData = { + dataParser.parse(value.toString) + } +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestTrainTask.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestTrainTask.scala new file mode 100644 index 000000000..c87396660 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestTrainTask.scala @@ -0,0 +1,64 @@ +package com.tencent.angel.ml.tree + +import com.tencent.angel.ml.core.TrainTask +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.core.utils.DataParser +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.worker.storage.MemoryDataBlock +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.io.{LongWritable, Text} + +class RandomForestTrainTask (val ctx: TaskContext) extends TrainTask[LongWritable, Text](ctx) { + + private val validRatio = conf.getDouble(MLConf.ML_VALIDATE_RATIO, MLConf.DEFAULT_ML_VALIDATE_RATIO) + + // validation data storage + var validDataBlock = new MemoryDataBlock[LabeledData](-1) + val sharedConf: SharedConf = SharedConf.get(conf) + override val dataParser = DataParser(sharedConf) + + /** + * @param ctx : task context + */ + @throws[Exception] + def train(ctx: TaskContext) { + val trainer = new RandomForestLearner(ctx) + trainer.train(taskDataBlock, validDataBlock) + } + + /** + * parse the input text to trainning data + * + * @param key the key + * @param value the text + */ + def parse(key: LongWritable, value: Text): LabeledData = { + dataParser.parse(value.toString) + } + + /** + * before trainning, preprocess input text to trainning data and put them into trainning data + * storage and validation data storage separately + */ + override + def preProcess(taskContext: TaskContext) { + var count = 0 + val valid = Math.ceil(1.0 / validRatio).asInstanceOf[Int] + + val reader = taskContext.getReader + + while (reader.nextKeyValue) { + val out = parse(reader.getCurrentKey, reader.getCurrentValue) + if (out != null) { + if (count % valid == 0) + validDataBlock.put(out) + else + taskDataBlock.put(out) + count += 1 + } + } + taskDataBlock.flush() + validDataBlock.flush() + } + +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala index e48bcb7d5..1bd2fc94c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala @@ -12,8 +12,6 @@ import scala.reflect.ClassTag /** * Abstraction for Decision Tree models. - * - * TODO: Add support for predicting probabilities and raw predictions SPARK-3727 */ trait DecisionTreeModel { @@ -74,7 +72,7 @@ private[tree] trait TreeEnsembleModel[M <: DecisionTreeModel] { /** Weights for each tree, zippable with [[trees]] */ def treeWeights: Array[Double] - private[tree] def javaTreeWeights: IntDoubleVector = VFactory.denseDoubleVector(treeWeights) + def treeWeightsVec: IntDoubleVector = VFactory.denseDoubleVector(treeWeights) /** Summary of the model */ override def toString: String = { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index b060cce37..fe6b8e342 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -20,22 +20,36 @@ package com.tencent.angel.ml.tree.conf import scala.beans.BeanProperty import scala.collection.JavaConverters._ - import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} +import scala.util.Try + /** * Stores all the configuration options for tree construction * @param algo Learning goal. Supported: Classification, Regression * @param impurity Criterion used for information gain calculation. * Supported for Classification: Gini, Entropy. Supported for Regression: Variance + * @param numTrees If 1, then no bootstrapping is used. If greater than 1, then bootstrapping is done. * @param maxDepth Maximum depth of the tree (e.g. depth 0 means 1 leaf node, * depth 1 means 1 internal node + 2 leaf nodes). * @param numClasses Number of classes for classification. (Ignored for regression.) * Default value is 2 (binary classification). * @param maxBins Maximum number of bins used for discretizing continuous features and * for choosing how to split on features at each node. + * @param subsamplingRate Fraction of the training data used for learning decision tree. + * @param featureSubsetStrategy Number of features to consider for splits at each node. + * Supported values: "auto", "all", "sqrt", "log2", "onethird". + * Supported numerical values: "(0.0-1.0]", "[1-n]". + * If "auto" is set, this parameter is set based on numTrees: + * if numTrees == 1, set to "all"; + * if numTrees is greater than 1 (forest) set to "sqrt" for + * classification and to "onethird" for regression. + * If a real value "n" in the range (0, 1.0] is set, + * use n * number of features. + * If an integer value "n" in the range (1, num features) is set, + * use n features. * @param quantileCalculationStrategy Algorithm for calculating quantiles. * Supported: QuantileStrategy.Sort * @param categoricalFeaturesInfo A map storing information about the categorical variables @@ -50,7 +64,6 @@ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} * @param maxMemoryInMB Maximum memory in MB allocated to histogram aggregation. Default value is 256 MB. * If too small, then 1 node will be split per iteration, * nd its aggregates may exceed this size. - * @param subsamplingRate Fraction of the training data used for learning decision tree. * @param useNodeIdCache If this is true, instead of passing trees to executors, * the algorithm will maintain a separate RDD of node Id cache for each row. * @param checkpointInterval How often to checkpoint when the node Id cache gets updated. @@ -58,15 +71,17 @@ import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} */ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var impurity: Impurity, - @BeanProperty var maxDepth: Int, + @BeanProperty var numTrees: Int = 1, + @BeanProperty var maxDepth: Int = 2, @BeanProperty var numClasses: Int = 2, @BeanProperty var maxBins: Int = 32, + @BeanProperty var subsamplingRate: Double = 1, + @BeanProperty var featureSubsetStrategy: String = "auto", var quantileCalculationStrategy: QuantileStrategy = Sort, var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), var minInstancesPerNode: Int = 1, var minInfoGain: Double = 0.0, var maxMemoryInMB: Int = 256, - var subsamplingRate: Double = 1, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { @@ -75,17 +90,20 @@ class Strategy (@BeanProperty var algo: Algo, } def isMulticlassWithCategoricalFeatures: Boolean = { - isMulticlassClassification && (categoricalFeaturesInfo.size > 0) + isMulticlassClassification && categoricalFeaturesInfo.nonEmpty } def this( algo: Algo, impurity: Impurity, + numTrees: Int, maxDepth: Int, numClasses: Int, maxBins: Int, + subsamplingRate: Double, + featureSubsetStrategy: String, categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]) { - this(algo, impurity, maxDepth, numClasses, maxBins, Sort, + this(algo, impurity, numTrees, maxDepth, numClasses, maxBins, subsamplingRate, featureSubsetStrategy, Sort, categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap) } @@ -139,6 +157,13 @@ class Strategy (@BeanProperty var algo: Algo, require(subsamplingRate > 0 && subsamplingRate <= 1, s"DecisionTree Strategy requires subsamplingRate <=1 and >0, but was given " + s"$subsamplingRate") + require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") + require(Strategy.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) + || Try(featureSubsetStrategy.toInt).filter(_ > 0).isSuccess + || Try(featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, + s"RandomForest given invalid featureSubsetStrategy: $featureSubsetStrategy." + + s" Supported values: ${Strategy.supportedFeatureSubsetStrategies.mkString(", ")}," + + s" (0.0-1.0], [1-n].") } /** @@ -153,6 +178,11 @@ class Strategy (@BeanProperty var algo: Algo, object Strategy { + /** + * List of supported feature subset sampling strategies. + */ + val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies + /** * Construct a default set of parameters for [[org.apache.spark.mllib.tree.DecisionTree]] * @param algo "Classification" or "Regression" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala index e510282f1..3bcd7db73 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala @@ -5,6 +5,7 @@ import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.tree.{DecisionTreeClassifierParams, DecisionTreeModel, TreeEnsembleModel} import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo} import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} +import com.tencent.angel.ml.tree.utils.ProbabilisticUtils /** * Decision tree model (http://en.wikipedia.org/wiki/Decision_tree_learning) for classification. @@ -30,7 +31,7 @@ private[tree] class DecisionTreeClassificationModel ( protected def raw2probabilityInPlace(rawPrediction: IntFloatVector): IntFloatVector = { if (rawPrediction.isDense) { - ProbabilisticClassificationModel.normalizeToProbabilitiesInPlace(rawPrediction) + ProbabilisticUtils.normalizeToProbabilitiesInPlace(rawPrediction) rawPrediction } else { throw new RuntimeException("Unexpected error in DecisionTreeClassificationModel:" + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala index b9a23feb7..97b2b1807 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala @@ -89,9 +89,7 @@ private[tree] object DecisionTreeMetadata { */ def buildMetadata( input: Array[LabeledData], - strategy: Strategy, - numTrees: Int, - featureSubsetStrategy: String): DecisionTreeMetadata = { + strategy: Strategy): DecisionTreeMetadata = { val numFeatures = input(0).getX.asInstanceOf[IntFloatVector].getDim if (numFeatures == 0) @@ -99,7 +97,7 @@ private[tree] object DecisionTreeMetadata { s"but was given by empty one.") require(numFeatures > 0, s"DecisionTree requires number of features > 0, " + s"but was given an empty features vector") - val numExamples = input.size + val numExamples = input.length val numClasses = strategy.algo match { case Classification => strategy.numClasses case Regression => 0 @@ -158,9 +156,9 @@ private[tree] object DecisionTreeMetadata { } // Set number of features to use per node (for random forests). - val _featureSubsetStrategy = featureSubsetStrategy match { + val _featureSubsetStrategy = strategy.featureSubsetStrategy match { case "auto" => - if (numTrees == 1) { + if (strategy.numTrees == 1) { "all" } else { if (strategy.algo == Classification) { @@ -169,7 +167,7 @@ private[tree] object DecisionTreeMetadata { "onethird" } } - case _ => featureSubsetStrategy + case _ => strategy.featureSubsetStrategy } val numFeaturesPerNode: Int = _featureSubsetStrategy match { @@ -193,16 +191,7 @@ private[tree] object DecisionTreeMetadata { new DecisionTreeMetadata(numFeatures, numExamples, numClasses, numBins.max, strategy.categoricalFeaturesInfo, unorderedFeatures.toSet, numBins, strategy.impurity, strategy.quantileCalculationStrategy, strategy.maxDepth, - strategy.minInstancesPerNode, strategy.minInfoGain, numTrees, numFeaturesPerNode) - } - - /** - * Version of [[DecisionTreeMetadata#buildMetadata]] for DecisionTree. - */ - def buildMetadata( - input: Array[LabeledData], - strategy: Strategy): DecisionTreeMetadata = { - buildMetadata(input, strategy, numTrees = 1, featureSubsetStrategy = "all") + strategy.minInstancesPerNode, strategy.minInfoGain, strategy.numTrees, numFeaturesPerNode) } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala index 9e1e08233..8589c5cc4 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -67,8 +67,6 @@ private[tree] object RandomForest { trainData: Array[LabeledData], validData: Array[LabeledData], strategy: OldStrategy, - numTrees: Int, - featureSubsetStrategy: String, seed: Long, // exposed for testing only, real trees are always prune prune: Boolean = true): Array[DecisionTreeModel] = { @@ -80,7 +78,7 @@ private[tree] object RandomForest { timer.start("init") val metadata = - DecisionTreeMetadata.buildMetadata(trainData, strategy, numTrees, featureSubsetStrategy) + DecisionTreeMetadata.buildMetadata(trainData, strategy) LOG.info("numFeatures: " + metadata.numFeatures) LOG.info("numClasses: " + metadata.numClasses) @@ -101,7 +99,7 @@ private[tree] object RandomForest { val trainTreeInput = TreePoint.convertToTreePoint(trainData, splits, metadata) val validTreeInput = TreePoint.convertToTreePoint(validData, splits, metadata) - val withReplacement = numTrees > 1 + val withReplacement = strategy.numTrees > 1 val baggedInput = BaggedPoint .convertToBaggedRDD(trainTreeInput, strategy.subsamplingRate, numTrees, withReplacement, seed) @@ -128,7 +126,7 @@ private[tree] object RandomForest { val nodeIdCache = if (strategy.useNodeIdCache) { Some(NodeIdCache.init( data = baggedInput, - numTrees = numTrees)) + numTrees = strategy.numTrees)) } else { None } @@ -147,8 +145,8 @@ private[tree] object RandomForest { rng.setSeed(seed) // Allocate and queue root nodes. - val topNodes = Array.fill[LearningNode](numTrees)(LearningNode.emptyNode(nodeIndex = 1)) - Range(0, numTrees).foreach(treeIndex => nodeStack.push((treeIndex, topNodes(treeIndex)))) + val topNodes = Array.fill[LearningNode](strategy.numTrees)(LearningNode.emptyNode(nodeIndex = 1)) + Range(0, strategy.numTrees).foreach(treeIndex => nodeStack.push((treeIndex, topNodes(treeIndex)))) timer.stop("init") diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala new file mode 100644 index 000000000..372354c31 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala @@ -0,0 +1,147 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.model.MLModel +import com.tencent.angel.ml.predict.PredictResult +import com.tencent.angel.ml.tree.conf.Algo.{Algo, Classification, Regression} +import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy.{Average, EnsembleCombiningStrategy, Sum, Vote} +import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel, DecisionTreePredictResult} +import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration + +import scala.collection.mutable + +/** + * Represents a tree ensemble model. + * + * @param algo algorithm for the ensemble model, either Classification or Regression + * @param trees tree ensembles + * @param treeWeights tree ensemble weights + * @param combiningStrategy strategy for combining the predictions, not used for regression. + */ +sealed class TreeEnsembleModel( + protected val algo: Algo, + protected val trees: Array[DecisionTreeModel], + protected val treeWeights: Array[Double], + protected val combiningStrategy: EnsembleCombiningStrategy, + conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { + + require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") + + private val sumWeights = math.max(treeWeights.sum, 1e-15) + + super.setSavePath(conf) + super.setLoadPath(conf) + + override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { + val ret = new MemoryDataBlock[PredictResult](-1) + + (0 until dataSet.size).foreach { idx => + val instance = dataSet.read + val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] + val y = instance.getY + val pred = predict(x) + + ret.put(DecisionTreePredictResult(idx, y, pred)) + } + + ret + } + + /** + * Predicts for a single data point using the weighted sum of ensemble predictions. + * + * @param features array representing a single data point + * @return predicted category from the trained model + */ + private def predictBySumming(features: IntFloatVector): Double = { + trees.zip(treeWeights).map{ case (tree, weight) => + tree.predict(features) * weight + }.sum + } + + /** + * Classifies a single data point based on (weighted) majority votes. + */ + private def predictByVoting(features: IntFloatVector): Double = { + val votes = mutable.Map.empty[Int, Double] + trees.view.zip(treeWeights).foreach { case (tree, weight) => + val prediction = tree.predict(features).toInt + votes(prediction) = votes.getOrElse(prediction, 0.0) + weight + } + votes.maxBy(_._2)._1 + } + + /** + * Predict values for a single data point using the model trained. + * + * @param features array representing a single data point + * @return predicted category from the trained model + */ + def predict(features: IntFloatVector): Double = { + (algo, combiningStrategy) match { + case (Regression, Sum) => + predictBySumming(features) + case (Regression, Average) => + predictBySumming(features) / sumWeights + case (Classification, Sum) => // binary classification + val prediction = predictBySumming(features) + // TODO: predicted labels are +1 or -1 for GBT. Need a better way to store this info. + if (prediction > 0.0) 1.0 else 0.0 + case (Classification, Vote) => + predictByVoting(features) + case _ => + throw new IllegalArgumentException( + "TreeEnsembleModel given unsupported (algo, combiningStrategy) combination: " + + s"($algo, $combiningStrategy).") + } + } + + /** + * Predict values for the given data set. + * + * @param features RDD representing data points to be predicted + * @return RDD[Double] where each entry contains the corresponding prediction + */ + def predict(features: List[IntFloatVector]): List[Double] = features.map(x => predict(x)) + + def predict(features: Array[IntFloatVector]): Array[Double] = { + predict(features.toList).toArray + } + + /** + * Print a summary of the model. + */ + override def toString: String = { + algo match { + case Classification => + s"TreeEnsembleModel classifier with $numTrees trees\n" + case Regression => + s"TreeEnsembleModel regressor with $numTrees trees\n" + case _ => throw new IllegalArgumentException( + s"TreeEnsembleModel given unknown algo parameter: $algo.") + } + } + + /** + * Print the full model to a string. + */ + def toDebugString: String = { + val header = toString + "\n" + header + trees.zipWithIndex.map { case (tree, treeIndex) => + s" Tree $treeIndex:\n" + tree.topNode.subtreeToString(4) + }.fold("")(_ + _) + } + + /** + * Get number of trees in ensemble. + */ + def numTrees: Int = trees.length + + /** + * Get total number of nodes, summed over all trees in the ensemble. + */ + def totalNumNodes: Int = trees.map(_.numNodes).sum +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala index f12c7ca32..9cd2f707e 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala @@ -166,7 +166,7 @@ object TreeEnsembleModel { object SaveUtils { - import com.tencent.angel.ml.tree.oldmodel.DecisionTreeModel.DataStruct.{NodeData, constructTrees} + import com.tencent.angel.ml.tree.oldmodel.DecisionTreeModel.DataStruct.NodeData case class Metadata( algo: String, @@ -183,13 +183,6 @@ object TreeEnsembleModel { */ case class EnsembleNodeData(treeId: Int, node: NodeData) - def save(path: String, model: TreeEnsembleModel, className: String): Unit = { - - // Create JSON metadata. - val ensembleMetadata = Metadata(model.algo.toString, model.trees(0).algo.toString, - model.combiningStrategy.toString, model.treeWeights) - } - /** * Load trees for an ensemble, and return them in order. * @param path path to load the model from diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/ProbabilisticUtils.scala similarity index 91% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/ProbabilisticUtils.scala index c88002400..1d0757fe5 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/ProbabilisticClassificationModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/ProbabilisticUtils.scala @@ -1,8 +1,8 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.utils import com.tencent.angel.ml.math2.vector.IntFloatVector -object ProbabilisticClassificationModel { +object ProbabilisticUtils { /** * Normalize a vector of raw predictions to be a multinomial probability vector, in place. @@ -29,4 +29,4 @@ object ProbabilisticClassificationModel { i += 1 } } -} \ No newline at end of file +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala new file mode 100644 index 000000000..36435a8ac --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala @@ -0,0 +1,49 @@ +package com.tencent.angel.ml.tree.utils + +import com.tencent.angel.client.AngelClientFactory +import com.tencent.angel.ml.core.MLRunner +import org.apache.commons.logging.LogFactory +import org.apache.hadoop.conf.Configuration + +class RandomForestRunner extends MLRunner { + + + val LOG = LogFactory.getLog(classOf[RandomForestRunner]) + + override def train(conf: Configuration): Unit = { + + val client = AngelClientFactory.get(conf) + val model = new GBDTModel(conf) + + try { + client.startPSServer() + client.loadModel(model) + client.runTask(classOf[GBDTTrainTask]) + client.waitForCompletion() + client.saveModel(model) + } finally { + client.stop() + } + + + } + + override def predict(conf: Configuration) { + conf.setInt("angel.worker.matrix.transfer.request.timeout.ms", 60000) + + val client = AngelClientFactory.get(conf) + val model = new GBDTModel(conf) + + try { + client.startPSServer() + client.loadModel(model) + client.runTask(classOf[GBDTPredictTask]) + client.waitForCompletion() + } finally { + client.stop() + } + + + } + +} diff --git a/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java b/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java index c0cdc5358..811d8f973 100644 --- a/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java +++ b/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java @@ -21,11 +21,9 @@ import com.tencent.angel.conf.AngelConf; import com.tencent.angel.ml.GBDT.GBDTRunner; import com.tencent.angel.ml.core.conf.MLConf; -import com.tencent.angel.ml.matrix.RowType; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalFileSystem; import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat; import org.apache.log4j.PropertyConfigurator; @@ -90,9 +88,9 @@ public class GBDTTest { // Set GBDT algorithm parameters conf.set(MLConf.ML_FEATURE_INDEX_RANGE(), String.valueOf(featureNum)); - conf.set(MLConf.ML_GBDT_TREE_NUM(), String.valueOf(treeNum)); - conf.set(MLConf.ML_GBDT_TREE_DEPTH(), String.valueOf(treeDepth)); - conf.set(MLConf.ML_GBDT_SPLIT_NUM(), String.valueOf(splitNum)); + conf.set(MLConf.ML_NUM_TREE(), String.valueOf(treeNum)); + conf.set(MLConf.ML_TREE_MAX_DEPTH(), String.valueOf(treeDepth)); + conf.set(MLConf.ML_TREE_MAX_BIN(), String.valueOf(splitNum)); conf.set(MLConf.ML_VALIDATE_RATIO(), String.valueOf(validateRatio)); conf.set(MLConf.ML_GBDT_SAMPLE_RATIO(), String.valueOf(sampleRatio)); conf.set(MLConf.ML_LEARN_RATE(), String.valueOf(learnRate)); From e8f5b51c0e92104a22700bfb50d3f931b856b536 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 19 Nov 2018 23:12:05 +0800 Subject: [PATCH 007/115] parse random forest configs --- .../angel/example/ml/GBDTLocalExample.java | 2 +- .../tencent/angel/ml/GBDT/GBDTLearner.scala | 6 ++-- .../com/tencent/angel/ml/GBDT/GBDTModel.scala | 4 +-- .../angel/ml/GBDT/param/RegTParam.java | 4 +-- .../tencent/angel/ml/core/conf/MLConf.scala | 24 ++++++++------ .../angel/ml/tree/RandomForestLearner.scala | 28 +++++++++++++--- .../tencent/angel/ml/tree/TreeParams.scala | 2 +- .../tencent/angel/ml/tree/conf/Strategy.scala | 32 +++++++++++-------- .../ml/tree/model/DecisionTreeMetadata.scala | 4 +-- .../angel/ml/tree/model/RandomForest.scala | 2 +- .../com/tencent/angel/ml/gbdt/GBDTTest.java | 2 +- 11 files changed, 71 insertions(+), 39 deletions(-) diff --git a/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java b/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java index cc01a6d31..b07a8dfc2 100644 --- a/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java +++ b/angel-ps/examples/src/main/java/com/tencent/angel/example/ml/GBDTLocalExample.java @@ -118,7 +118,7 @@ public void setConf(int mode) { conf.set(MLConf.ML_TREE_MAX_DEPTH(), String.valueOf(treeDepth)); conf.set(MLConf.ML_TREE_MAX_BIN(), String.valueOf(splitNum)); conf.set(MLConf.ML_VALIDATE_RATIO(), String.valueOf(validateRatio)); - conf.set(MLConf.ML_GBDT_SAMPLE_RATIO(), String.valueOf(sampleRatio)); + conf.set(MLConf.ML_TREE_FEATURE_SAMPLE_RATE(), String.valueOf(sampleRatio)); conf.set(MLConf.ML_LEARN_RATE(), String.valueOf(learnRate)); } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala index 700992eb3..7c2f38053 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTLearner.scala @@ -47,10 +47,10 @@ class GBDTLearner(override val ctx: TaskContext) extends MLLearner(ctx) { param.numNonzero = conf.getInt(MLConf.ML_MODEL_SIZE, MLConf.DEFAULT_ML_MODEL_SIZE) param.numSplit = conf.getInt(MLConf.ML_TREE_MAX_BIN, MLConf.DEFAULT_ML_TREE_MAX_BIN) param.treeNum = conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE) - param.maxDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_DEPTH) - param.colSample = conf.getFloat(MLConf.ML_GBDT_SAMPLE_RATIO, MLConf.DEFAULT_ML_GBDT_SAMPLE_RATIO) + param.maxDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_MAX_DEPTH) + param.colSample = conf.getFloat(MLConf.ML_TREE_FEATURE_SAMPLE_RATE, MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_RATE) param.learningRate = conf.getFloat(MLConf.ML_LEARN_RATE, MLConf.DEFAULT_ML_LEARN_RATE.asInstanceOf[Float]) - param.maxThreadNum = conf.getInt(MLConf.ML_GBDT_THREAD_NUM, MLConf.DEFAULT_ML_GBDT_THREAD_NUM) + param.maxThreadNum = conf.getInt(MLConf.ML_TREE_NUM_THREAD, MLConf.DEFAULT_ML_TREE_NUM_THREAD) param.batchSize = conf.getInt(MLConf.ML_GBDT_BATCH_SIZE, MLConf.DEFAULT_ML_GBDT_BATCH_SIZE) param.isServerSplit = conf.getBoolean(MLConf.ML_GBDT_SERVER_SPLIT, MLConf.DEFAULT_ML_GBDT_SERVER_SPLIT) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala index 31a3d000b..055d015a0 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala @@ -62,9 +62,9 @@ class GBDTModel(conf: Configuration, _ctx: TaskContext = null) extends MLModel(c var indexRange = conf.getInt(MLConf.ML_FEATURE_INDEX_RANGE, MLConf.DEFAULT_ML_FEATURE_INDEX_RANGE) val maxTreeNum = conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE) - val maxTreeDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_DEPTH) + val maxTreeDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_MAX_DEPTH) val splitNum = conf.getInt(MLConf.ML_TREE_MAX_BIN, MLConf.DEFAULT_ML_TREE_MAX_BIN) - val featSampleRatio = conf.getFloat(MLConf.ML_GBDT_SAMPLE_RATIO, MLConf.DEFAULT_ML_GBDT_SAMPLE_RATIO) + val featSampleRatio = conf.getFloat(MLConf.ML_TREE_FEATURE_SAMPLE_RATE, MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_RATE) val cateFeatStr = conf.get(MLConf.ML_GBDT_CATE_FEAT, MLConf.DEFAULT_ML_GBDT_CATE_FEAT) val cateFeatNum = if (cateFeatStr.contains(",")) cateFeatStr.split(",").length else 1 diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java index afa395040..11f5a6448 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/param/RegTParam.java @@ -37,7 +37,7 @@ public class RegTParam implements TrainParam { // minimum loss change required for a split public float minSplitLoss = 0; // maximum depth of a tree - public int maxDepth = MLConf.DEFAULT_ML_TREE_DEPTH(); + public int maxDepth = MLConf.DEFAULT_ML_TREE_MAX_DEPTH(); // number of features public int numFeature; // number of nonzero @@ -48,7 +48,7 @@ public class RegTParam implements TrainParam { // base instance weight public float baseWeight = 0; // minimum amount of hessian(weight) allowed in a child - public float minChildWeight = (float) MLConf.DEFAULT_ML_GBDT_MIN_CHILD_WEIGHT(); + public float minChildWeight = (float) MLConf.DEFAULT_ML_TREE_MIN_CHILD_WEIGHT(); // L2 regularization factor public float regLambda = (float) MLConf.DEFAULT_ML_GBDT_REG_LAMBDA(); // L1 regularization factor diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 948668eaf..6c70ffacf 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -165,26 +165,32 @@ object MLConf { val ML_NUM_TREE = "ml.num.tree" val DEFAULT_ML_NUM_TREE = 10 val ML_TREE_MAX_DEPTH = "ml.tree.max.depth" - val DEFAULT_ML_TREE_DEPTH = 2 - val ML_TREE_MAX_NODE_NUM = "ml.tree.max.node.num" - val ML_TREE_MAX_BIN = "ml.tree.max.num" + val DEFAULT_ML_TREE_MAX_DEPTH = 2 + val ML_TREE_MAX_NUM_NODE = "ml.tree.max.node.num" + val ML_TREE_MAX_BIN = "ml.tree.max.bin" val DEFAULT_ML_TREE_MAX_BIN = 3 - val ML_GBDT_SAMPLE_RATIO = "ml.gbdt.sample.ratio" - val DEFAULT_ML_GBDT_SAMPLE_RATIO = 1 - val ML_GBDT_MIN_CHILD_WEIGHT = "ml.gbdt.min.child.weight" - val DEFAULT_ML_GBDT_MIN_CHILD_WEIGHT = 0.01 + val ML_TREE_SUB_SAMPLE_RATE = "ml.tree.sub.sample.rae" + val DEFAULT_ML_TREE_SUB_SAMPLE_RATE = 1 + val ML_TREE_FEATURE_SAMPLE_STRATEGY = "ml.tree.feature.sample.strategy" + val DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY = "all" + val ML_TREE_FEATURE_SAMPLE_RATE = "ml.tree.feature.sample.rate" + val DEFAULT_ML_TREE_FEATURE_SAMPLE_RATE = 1 + val ML_TREE_MIN_CHILD_WEIGHT = "ml.tree.min.child.weight" + val DEFAULT_ML_TREE_MIN_CHILD_WEIGHT = 0.01 val ML_GBDT_REG_ALPHA = "ml.gbdt.reg.alpha" val DEFAULT_ML_GBDT_REG_ALPHA = 0 val ML_GBDT_REG_LAMBDA = "ml.gbdt.reg.lambda" val DEFAULT_ML_GBDT_REG_LAMBDA = 1.0 - val ML_GBDT_THREAD_NUM = "ml.gbdt.thread.num" - val DEFAULT_ML_GBDT_THREAD_NUM = 20 + val ML_TREE_NUM_THREAD = "ml.tree.num.thread" + val DEFAULT_ML_TREE_NUM_THREAD = 20 val ML_GBDT_BATCH_SIZE = "ml.gbdt.batch.size" val DEFAULT_ML_GBDT_BATCH_SIZE = 10000 val ML_GBDT_SERVER_SPLIT = "ml.gbdt.server.split" val DEFAULT_ML_GBDT_SERVER_SPLIT = false val ML_GBDT_CATE_FEAT = "ml.gbdt.cate.feat" val DEFAULT_ML_GBDT_CATE_FEAT = "none" + val ML_TREE_IMPURITY = "ml.tree.impurity" + val DEFAULT_ML_TREE_IMPURITY = "gini" /** The loss sum of all samples */ val TRAIN_LOSS = "train.loss" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index e5d585b07..953e3c890 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -1,6 +1,7 @@ package com.tencent.angel.ml.tree import com.tencent.angel.ml.core.MLLearner +import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel @@ -8,7 +9,7 @@ import scala.util.Random import com.tencent.angel.ml.tree.model.{RandomForest => NewRandomForest} import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ -import com.tencent.angel.ml.tree.conf.Strategy +import com.tencent.angel.ml.tree.conf.{Algo, Strategy} import com.tencent.angel.ml.tree.impurity.Impurities import com.tencent.angel.ml.tree.oldmodel._ import com.tencent.angel.worker.storage.DataBlock @@ -38,13 +39,30 @@ import scala.collection.mutable.ArrayBuffer */ class RandomForestLearner ( override val ctx: TaskContext, - val strategy: Strategy, + val strategy: Strategy = null, val seed: Int) extends MLLearner(ctx) { - strategy.assertValid() + def initStrategy(): Unit = { + strategy.setAlgo(conf.get(MLConf.ML_TREE_TASK_TYPE, + MLConf.DEFAULT_ML_TREE_TASK_TYPE).toLowerCase) + strategy.setImpurity(conf.get(MLConf.ML_TREE_IMPURITY, + MLConf.DEFAULT_ML_TREE_IMPURITY).toLowerCase) + strategy.setNumTrees(conf.getInt(MLConf.ML_NUM_TREE, + MLConf.DEFAULT_ML_NUM_TREE)) + strategy.setMaxDepth(conf.getInt(MLConf.ML_TREE_MAX_DEPTH, + MLConf.DEFAULT_ML_TREE_MAX_DEPTH)) + strategy.setNumClasses(conf.getInt(MLConf.ML_NUM_CLASS, + MLConf.DEFAULT_ML_NUM_CLASS)) + strategy.setMaxBins(conf.getInt(MLConf.ML_TREE_MAX_BIN, + MLConf.DEFAULT_ML_TREE_MAX_BIN)) + strategy.setSubSamplingRate(conf.getDouble(MLConf.ML_TREE_SUB_SAMPLE_RATE, + MLConf.DEFAULT_ML_TREE_SUB_SAMPLE_RATE)) + strategy.setFeatureSamplingStrategy(conf.get(MLConf.ML_TREE_FEATURE_SAMPLE_STRATEGY, + MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY)) + } - private[tree] def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { + def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { input.resetReadIndex() val ret = new ArrayBuffer[LabeledData] (0 until input.size()).foreach{ idx => @@ -61,6 +79,8 @@ class RandomForestLearner ( */ override def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { + if (strategy == null) initStrategy() + strategy.assertValid() val trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) val validDataSet: Array[LabeledData] = convertDataBlock(validBlock) val trees: Array[DecisionTreeModel] = NewRandomForest.train(trainDataSet, validDataSet, strategy, seed.toLong) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala index 73f78f743..43030db63 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala @@ -138,7 +138,7 @@ trait DecisionTreeParams { strategy.useNodeIdCache = getCacheNodeIds strategy.numClasses = numClasses strategy.categoricalFeaturesInfo = categoricalFeatures - strategy.subsamplingRate = subsamplingRate + strategy.subSamplingRate = subsamplingRate strategy } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index fe6b8e342..748454fa0 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -22,7 +22,7 @@ import scala.beans.BeanProperty import scala.collection.JavaConverters._ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ -import com.tencent.angel.ml.tree.impurity.{Entropy, Gini, Impurity, Variance} +import com.tencent.angel.ml.tree.impurity._ import scala.util.Try @@ -38,8 +38,8 @@ import scala.util.Try * Default value is 2 (binary classification). * @param maxBins Maximum number of bins used for discretizing continuous features and * for choosing how to split on features at each node. - * @param subsamplingRate Fraction of the training data used for learning decision tree. - * @param featureSubsetStrategy Number of features to consider for splits at each node. + * @param subSamplingRate Fraction of the training data used for learning decision tree. + * @param featureSamplingStrategy Number of features to consider for splits at each node. * Supported values: "auto", "all", "sqrt", "log2", "onethird". * Supported numerical values: "(0.0-1.0]", "[1-n]". * If "auto" is set, this parameter is set based on numTrees: @@ -75,8 +75,8 @@ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var maxDepth: Int = 2, @BeanProperty var numClasses: Int = 2, @BeanProperty var maxBins: Int = 32, - @BeanProperty var subsamplingRate: Double = 1, - @BeanProperty var featureSubsetStrategy: String = "auto", + @BeanProperty var subSamplingRate: Double = 1, + @BeanProperty var featureSamplingStrategy: String = "auto", var quantileCalculationStrategy: QuantileStrategy = Sort, var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), var minInstancesPerNode: Int = 1, @@ -115,6 +115,12 @@ class Strategy (@BeanProperty var algo: Algo, case "Regression" => setAlgo(Regression) } + def setImpurity(impurity: String): Unit = impurity match { + case "gini" => Impurities.fromString("gini") + case "entropy" => Impurities.fromString("entropy") + case "variance" => Impurities.fromString("variance") + } + /** * Sets categoricalFeaturesInfo using a Java Map. */ @@ -154,14 +160,14 @@ class Strategy (@BeanProperty var algo: Algo, s"DecisionTree Strategy requires minInstancesPerNode >= 1 but was given $minInstancesPerNode") require(maxMemoryInMB <= 10240, s"DecisionTree Strategy requires maxMemoryInMB <= 10240, but was given $maxMemoryInMB") - require(subsamplingRate > 0 && subsamplingRate <= 1, + require(subSamplingRate > 0 && subSamplingRate <= 1, s"DecisionTree Strategy requires subsamplingRate <=1 and >0, but was given " + - s"$subsamplingRate") + s"$subSamplingRate") require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") - require(Strategy.supportedFeatureSubsetStrategies.contains(featureSubsetStrategy) - || Try(featureSubsetStrategy.toInt).filter(_ > 0).isSuccess - || Try(featureSubsetStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, - s"RandomForest given invalid featureSubsetStrategy: $featureSubsetStrategy." + + require(Strategy.supportedFeatureSubsetStrategies.contains(featureSamplingStrategy) + || Try(featureSamplingStrategy.toInt).filter(_ > 0).isSuccess + || Try(featureSamplingStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, + s"RandomForest given invalid featureSubsetStrategy: $featureSamplingStrategy." + s" Supported values: ${Strategy.supportedFeatureSubsetStrategies.mkString(", ")}," + s" (0.0-1.0], [1-n].") } @@ -172,7 +178,7 @@ class Strategy (@BeanProperty var algo: Algo, def copy: Strategy = { new Strategy(algo, impurity, maxDepth, numClasses, maxBins, quantileCalculationStrategy, categoricalFeaturesInfo, minInstancesPerNode, minInfoGain, - maxMemoryInMB, subsamplingRate, useNodeIdCache, checkpointInterval) + maxMemoryInMB, subSamplingRate, useNodeIdCache, checkpointInterval) } } @@ -184,7 +190,7 @@ object Strategy { val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies /** - * Construct a default set of parameters for [[org.apache.spark.mllib.tree.DecisionTree]] + * Construct a default set of parameters for DecisionTree * @param algo "Classification" or "Regression" */ def defaultStrategy(algo: String): Strategy = { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala index 97b2b1807..cc468c1f6 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala @@ -156,7 +156,7 @@ private[tree] object DecisionTreeMetadata { } // Set number of features to use per node (for random forests). - val _featureSubsetStrategy = strategy.featureSubsetStrategy match { + val _featureSubsetStrategy = strategy.featureSamplingStrategy match { case "auto" => if (strategy.numTrees == 1) { "all" @@ -167,7 +167,7 @@ private[tree] object DecisionTreeMetadata { "onethird" } } - case _ => strategy.featureSubsetStrategy + case _ => strategy.featureSamplingStrategy } val numFeaturesPerNode: Int = _featureSubsetStrategy match { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala index 8589c5cc4..7df62b42f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -102,7 +102,7 @@ private[tree] object RandomForest { val withReplacement = strategy.numTrees > 1 val baggedInput = BaggedPoint - .convertToBaggedRDD(trainTreeInput, strategy.subsamplingRate, numTrees, withReplacement, seed) + .convertToBaggedRDD(trainTreeInput, strategy.subSamplingRate, numTrees, withReplacement, seed) // depth of the decision tree val maxDepth = strategy.maxDepth diff --git a/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java b/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java index 811d8f973..aad54fe55 100644 --- a/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java +++ b/angel-ps/mllib/src/test/java/com/tencent/angel/ml/gbdt/GBDTTest.java @@ -92,7 +92,7 @@ public class GBDTTest { conf.set(MLConf.ML_TREE_MAX_DEPTH(), String.valueOf(treeDepth)); conf.set(MLConf.ML_TREE_MAX_BIN(), String.valueOf(splitNum)); conf.set(MLConf.ML_VALIDATE_RATIO(), String.valueOf(validateRatio)); - conf.set(MLConf.ML_GBDT_SAMPLE_RATIO(), String.valueOf(sampleRatio)); + conf.set(MLConf.ML_TREE_FEATURE_SAMPLE_RATE(), String.valueOf(sampleRatio)); conf.set(MLConf.ML_LEARN_RATE(), String.valueOf(learnRate)); } catch (Exception x) { From 91b94076bda63f247102cbafdc622ab0b2e86001 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 20 Nov 2018 09:39:54 +0800 Subject: [PATCH 008/115] param parser --- .../core/utils/paramsutils/ParamParser.scala | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala new file mode 100644 index 000000000..6f38a59df --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala @@ -0,0 +1,32 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.core.utils.paramsutils + +object ParamParser { + + def parseMap(line: String, separator1: String = ",", + separator2: String = ":"): Map[String, String] = { + line.trim + .split(separator1) + .map(_.split(separator2)) + .map{ case Array(k, v) => (k, v) } + .toMap + } + +} From b11114b7a6bd100ad424dc2557945c6335c46040 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 20 Nov 2018 19:12:29 +0800 Subject: [PATCH 009/115] add conf and strategy --- .../com/tencent/angel/ml/GBDT/GBDTModel.scala | 2 +- .../angel/ml/GBDT/algo/GBDTController.java | 2 +- .../tencent/angel/ml/core/conf/MLConf.scala | 8 +- ...gStrategy.scala => EnsembleStrategy.scala} | 11 +- .../angel/ml/tree/conf/QuantileStrategy.scala | 7 ++ .../tencent/angel/ml/tree/conf/Strategy.scala | 103 ++++++++++++------ 6 files changed, 96 insertions(+), 37 deletions(-) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/{EnsembleCombiningStrategy.scala => EnsembleStrategy.scala} (71%) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala index 055d015a0..3b5000d40 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/GBDTModel.scala @@ -65,7 +65,7 @@ class GBDTModel(conf: Configuration, _ctx: TaskContext = null) extends MLModel(c val maxTreeDepth = conf.getInt(MLConf.ML_TREE_MAX_DEPTH, MLConf.DEFAULT_ML_TREE_MAX_DEPTH) val splitNum = conf.getInt(MLConf.ML_TREE_MAX_BIN, MLConf.DEFAULT_ML_TREE_MAX_BIN) val featSampleRatio = conf.getFloat(MLConf.ML_TREE_FEATURE_SAMPLE_RATE, MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_RATE) - val cateFeatStr = conf.get(MLConf.ML_GBDT_CATE_FEAT, MLConf.DEFAULT_ML_GBDT_CATE_FEAT) + val cateFeatStr = conf.get(MLConf.ML_TREE_CATEGORICAL_FEATURE, MLConf.DEFAULT_ML_TREE_CATEGORICAL_FEATURE) val cateFeatNum = if (cateFeatStr.contains(",")) cateFeatStr.split(",").length else 1 val maxTNodeNum: Int = Maths.pow(2, maxTreeDepth) - 1 diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java index 756c859a8..bf8b4b43b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/GBDT/algo/GBDTController.java @@ -120,7 +120,7 @@ public void init() throws Exception { this.sketches = new float[this.param.numFeature * this.param.numSplit]; String cateFeatStr = this.taskContext.getConf() - .get(MLConf.ML_GBDT_CATE_FEAT(), MLConf.DEFAULT_ML_GBDT_CATE_FEAT()); + .get(MLConf.ML_TREE_CATEGORICAL_FEATURE(), MLConf.DEFAULT_ML_TREE_CATEGORICAL_FEATURE()); cateFeatList = new ArrayList<>(); cateFeatNum = new HashMap<>(); switch (cateFeatStr) { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 6c70ffacf..88dffbabf 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -175,6 +175,10 @@ object MLConf { val DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY = "all" val ML_TREE_FEATURE_SAMPLE_RATE = "ml.tree.feature.sample.rate" val DEFAULT_ML_TREE_FEATURE_SAMPLE_RATE = 1 + val ML_TREE_NODE_MIN_INSTANCE = "ml.tree.node.min.instance" + val DEFAULT_ML_TREE_NODE_MIN_INSTANCE = 1 + val ML_TREE_NODE_MIN_INFOGAIN = "ml.tree.node.min.infogain" + val DEFAULT_ML_TREE_NODE_MIN_INFOGAIN = 0 val ML_TREE_MIN_CHILD_WEIGHT = "ml.tree.min.child.weight" val DEFAULT_ML_TREE_MIN_CHILD_WEIGHT = 0.01 val ML_GBDT_REG_ALPHA = "ml.gbdt.reg.alpha" @@ -187,8 +191,8 @@ object MLConf { val DEFAULT_ML_GBDT_BATCH_SIZE = 10000 val ML_GBDT_SERVER_SPLIT = "ml.gbdt.server.split" val DEFAULT_ML_GBDT_SERVER_SPLIT = false - val ML_GBDT_CATE_FEAT = "ml.gbdt.cate.feat" - val DEFAULT_ML_GBDT_CATE_FEAT = "none" + val ML_TREE_CATEGORICAL_FEATURE = "ml.tree.categorical.feature" + val DEFAULT_ML_TREE_CATEGORICAL_FEATURE = "" val ML_TREE_IMPURITY = "ml.tree.impurity" val DEFAULT_ML_TREE_IMPURITY = "gini" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleStrategy.scala similarity index 71% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleStrategy.scala index 8a7ee590c..dbead9f8b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleCombiningStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/EnsembleStrategy.scala @@ -21,10 +21,17 @@ package com.tencent.angel.ml.tree.conf /** * Enum to select ensemble combining strategy for base learners */ -object EnsembleCombiningStrategy extends Enumeration { +object EnsembleStrategy extends Enumeration { - type EnsembleCombiningStrategy = Value + type EnsembleStrategy = Value val Average, Sum, Vote = Value + + def fromString(name: String): EnsembleStrategy = name match { + case "average" | "Average" => Average + case "sum" | "Sum" => Sum + case "vote" | "Vote" => Vote + case _ => throw new IllegalArgumentException(s"Did not recognize EnsembleStrategy name: $name") + } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala index 53eacc795..af5f42180 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/QuantileStrategy.scala @@ -26,4 +26,11 @@ object QuantileStrategy extends Enumeration { type QuantileStrategy = Value val Sort, MinMax, ApproxHist = Value + + def fromString(name: String): QuantileStrategy = name.toLowerCase match { + case "sort" => Sort + case "minmax" => MinMax + case "approx" | "approxhist" => ApproxHist + case _ => throw new IllegalArgumentException(s"Did not recognize QuantileStrategy name: $name") + } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index 748454fa0..a17573663 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -18,11 +18,18 @@ package com.tencent.angel.ml.tree.conf +import java.util.Locale + +import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.ml.core.utils.paramsutils.ParamParser + import scala.beans.BeanProperty import scala.collection.JavaConverters._ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ +import com.tencent.angel.ml.tree.data.TreeEnsembleParams import com.tencent.angel.ml.tree.impurity._ +import org.apache.hadoop.conf.Configuration import scala.util.Try @@ -50,9 +57,9 @@ import scala.util.Try * use n * number of features. * If an integer value "n" in the range (1, num features) is set, * use n features. - * @param quantileCalculationStrategy Algorithm for calculating quantiles. + * @param quantileStrategy Algorithm for calculating quantiles. * Supported: QuantileStrategy.Sort - * @param categoricalFeaturesInfo A map storing information about the categorical variables + * @param categoricalFeatures A map storing information about the categorical variables * and the number of discrete values they take. An entry (n to k) indicates that * feature n is categorical with k categories indexed from 0: {0, 1, ..., k-1}. * @param minInstancesPerNode Minimum number of instances each child must have after split. Default value is 1. @@ -77,10 +84,10 @@ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var maxBins: Int = 32, @BeanProperty var subSamplingRate: Double = 1, @BeanProperty var featureSamplingStrategy: String = "auto", - var quantileCalculationStrategy: QuantileStrategy = Sort, - var categoricalFeaturesInfo: Map[Int, Int] = Map[Int, Int](), - var minInstancesPerNode: Int = 1, - var minInfoGain: Double = 0.0, + @BeanProperty var quantileStrategy: QuantileStrategy = Sort, + @BeanProperty var categoricalFeatures: Map[Int, Int] = Map[Int, Int](), + @BeanProperty var minInstancesPerNode: Int = 1, + @BeanProperty var minInfoGain: Double = 0.0, var maxMemoryInMB: Int = 256, var useNodeIdCache: Boolean = false, var checkpointInterval: Int = 10) extends Serializable { @@ -90,7 +97,7 @@ class Strategy (@BeanProperty var algo: Algo, } def isMulticlassWithCategoricalFeatures: Boolean = { - isMulticlassClassification && categoricalFeaturesInfo.nonEmpty + isMulticlassClassification && categoricalFeatures.nonEmpty } def this( @@ -100,34 +107,40 @@ class Strategy (@BeanProperty var algo: Algo, maxDepth: Int, numClasses: Int, maxBins: Int, - subsamplingRate: Double, + subSamplingRate: Double, featureSubsetStrategy: String, - categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]) { - this(algo, impurity, numTrees, maxDepth, numClasses, maxBins, subsamplingRate, featureSubsetStrategy, Sort, + categoricalFeaturesInfo: Map[Int, Int]) { + this(algo, impurity, numTrees, maxDepth, numClasses, maxBins, subSamplingRate, featureSubsetStrategy, Sort, categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap) } /** * Sets Algorithm using a String. */ - def setAlgo(algo: String): Unit = algo match { - case "Classification" => setAlgo(Classification) - case "Regression" => setAlgo(Regression) + def setAlgo(algo: String): Unit = algo.toLowerCase match { + case "classification" => setAlgo(Classification) + case "regression" => setAlgo(Regression) + case _ => throw new IllegalArgumentException(s"Did not recognize Algo name: $algo") } - def setImpurity(impurity: String): Unit = impurity match { - case "gini" => Impurities.fromString("gini") - case "entropy" => Impurities.fromString("entropy") - case "variance" => Impurities.fromString("variance") + def setImpurity(impurity: String): Unit = impurity.toLowerCase match { + case "gini" => setImpurity(Gini) + case "entropy" => setImpurity(Entropy) + case "variance" => setImpurity(Variance) + case _ => throw new IllegalArgumentException(s"Did not recognize Impurity name: $impurity") } - /** - * Sets categoricalFeaturesInfo using a Java Map. - */ - def setCategoricalFeaturesInfo( - categoricalFeaturesInfo: java.util.Map[java.lang.Integer, java.lang.Integer]): Unit = { - this.categoricalFeaturesInfo = - categoricalFeaturesInfo.asInstanceOf[java.util.Map[Int, Int]].asScala.toMap + def setQuantileStrategy(quantile: String): Unit = quantile.toLowerCase match { + case "sort" => setQuantileStrategy(Sort) + case "minmax" => setQuantileStrategy(MinMax) + case "approx" | "approxhist" => setQuantileStrategy(ApproxHist) + case _ => throw new IllegalArgumentException(s"Did not recognize QuantileStrategy name: $quantile") + } + + def setCategoricalFeatures(line: String): Unit = { + val cateMap = ParamParser.parseMap(line) + .map{ case (k, v) => (k.toString.toInt, v.toString.toInt) } + this.categoricalFeatures = cateMap } /** @@ -152,33 +165,33 @@ class Strategy (@BeanProperty var algo: Algo, s"DecisionTree Strategy given invalid algo parameter: $algo." + s" Valid settings are: Classification, Regression.") } + require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") require(maxDepth >= 0, s"DecisionTree Strategy given invalid maxDepth parameter: $maxDepth." + s" Valid values are integers >= 0.") require(maxBins >= 2, s"DecisionTree Strategy given invalid maxBins parameter: $maxBins." + s" Valid values are integers >= 2.") require(minInstancesPerNode >= 1, s"DecisionTree Strategy requires minInstancesPerNode >= 1 but was given $minInstancesPerNode") - require(maxMemoryInMB <= 10240, - s"DecisionTree Strategy requires maxMemoryInMB <= 10240, but was given $maxMemoryInMB") require(subSamplingRate > 0 && subSamplingRate <= 1, s"DecisionTree Strategy requires subsamplingRate <=1 and >0, but was given " + s"$subSamplingRate") - require(numTrees > 0, s"RandomForest requires numTrees > 0, but was given numTrees = $numTrees.") require(Strategy.supportedFeatureSubsetStrategies.contains(featureSamplingStrategy) || Try(featureSamplingStrategy.toInt).filter(_ > 0).isSuccess || Try(featureSamplingStrategy.toDouble).filter(_ > 0).filter(_ <= 1.0).isSuccess, s"RandomForest given invalid featureSubsetStrategy: $featureSamplingStrategy." + s" Supported values: ${Strategy.supportedFeatureSubsetStrategies.mkString(", ")}," + s" (0.0-1.0], [1-n].") + require(maxMemoryInMB <= 10240, + s"DecisionTree Strategy requires maxMemoryInMB <= 10240, but was given $maxMemoryInMB") } /** * Returns a shallow copy of this instance. */ def copy: Strategy = { - new Strategy(algo, impurity, maxDepth, numClasses, maxBins, - quantileCalculationStrategy, categoricalFeaturesInfo, minInstancesPerNode, minInfoGain, - maxMemoryInMB, subSamplingRate, useNodeIdCache, checkpointInterval) + new Strategy(algo, impurity, numTrees, maxDepth, numClasses, maxBins, + subSamplingRate, featureSamplingStrategy, quantileStrategy, categoricalFeatures, + minInstancesPerNode, minInfoGain, maxMemoryInMB, useNodeIdCache, checkpointInterval) } } @@ -187,7 +200,8 @@ object Strategy { /** * List of supported feature subset sampling strategies. */ - val supportedFeatureSubsetStrategies: Array[String] = NewRFParams.supportedFeatureSubsetStrategies + val supportedFeatureSubsetStrategies: Array[String] = + Array("auto", "all", "onethird", "sqrt", "log2").map(_.toLowerCase) /** * Construct a default set of parameters for DecisionTree @@ -208,4 +222,31 @@ object Strategy { new Strategy(algo = Regression, impurity = Variance, maxDepth = 10, numClasses = 0) } + def initStrategy(conf: Configuration): Strategy = { + val strategy = defaultStrategy(conf.get(MLConf.ML_TREE_TASK_TYPE, + MLConf.DEFAULT_ML_TREE_TASK_TYPE).toLowerCase) + strategy.setImpurity(conf.get(MLConf.ML_TREE_IMPURITY, + MLConf.DEFAULT_ML_TREE_IMPURITY).toLowerCase) + strategy.setNumTrees(conf.getInt(MLConf.ML_NUM_TREE, + MLConf.DEFAULT_ML_NUM_TREE)) + strategy.setMaxDepth(conf.getInt(MLConf.ML_TREE_MAX_DEPTH, + MLConf.DEFAULT_ML_TREE_MAX_DEPTH)) + strategy.setNumClasses(conf.getInt(MLConf.ML_NUM_CLASS, + MLConf.DEFAULT_ML_NUM_CLASS)) + strategy.setMaxBins(conf.getInt(MLConf.ML_TREE_MAX_BIN, + MLConf.DEFAULT_ML_TREE_MAX_BIN)) + strategy.setSubSamplingRate(conf.getDouble(MLConf.ML_TREE_SUB_SAMPLE_RATE, + MLConf.DEFAULT_ML_TREE_SUB_SAMPLE_RATE)) + strategy.setFeatureSamplingStrategy(conf.get(MLConf.ML_TREE_FEATURE_SAMPLE_STRATEGY, + MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY)) + strategy.setCategoricalFeatures(conf.get(MLConf.ML_TREE_CATEGORICAL_FEATURE, + MLConf.DEFAULT_ML_TREE_CATEGORICAL_FEATURE)) + strategy.setMinInstancesPerNode(conf.getInt(MLConf.ML_TREE_NODE_MIN_INSTANCE, + MLConf.DEFAULT_ML_TREE_NODE_MIN_INSTANCE)) + strategy.setMinInfoGain(conf.getDouble(MLConf.ML_TREE_NODE_MIN_INFOGAIN, + MLConf.DEFAULT_ML_TREE_NODE_MIN_INFOGAIN)) + strategy.assertValid() + strategy + } + } From 8ae7f62ffdd726f839e12dfd8846a4244a9b6e7a Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 20 Nov 2018 19:13:29 +0800 Subject: [PATCH 010/115] basic data structure --- .../ml/tree/{model => data}/BaggedPoint.scala | 2 +- .../{model => data}/DTStatsAggregator.scala | 2 +- .../DecisionTreeMetadata.scala | 23 +++++++++---------- .../angel/ml/tree/{model => data}/Node.scala | 2 +- .../ml/tree/{model => data}/NodeIdCache.scala | 4 +++- .../angel/ml/tree/{model => data}/Split.scala | 2 +- .../angel/ml/tree/{ => data}/TreeParams.scala | 6 ++--- .../ml/tree/{model => data}/TreePoint.scala | 6 +---- 8 files changed, 22 insertions(+), 25 deletions(-) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/BaggedPoint.scala (99%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/DTStatsAggregator.scala (99%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/DecisionTreeMetadata.scala (93%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/Node.scala (99%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/NodeIdCache.scala (96%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/Split.scala (99%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{ => data}/TreeParams.scala (99%) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{model => data}/TreePoint.scala (94%) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/BaggedPoint.scala similarity index 99% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/BaggedPoint.scala index 09e1514e1..ebf235c12 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/BaggedPoint.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/BaggedPoint.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.tree.utils.XORShiftRandom import org.apache.commons.math3.distribution.PoissonDistribution diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala similarity index 99% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala index e4deb3763..00fd1c458 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DTStatsAggregator.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.tree.impurity._ diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DecisionTreeMetadata.scala similarity index 93% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DecisionTreeMetadata.scala index cc468c1f6..9cd1a7e31 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeMetadata.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DecisionTreeMetadata.scala @@ -1,17 +1,16 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.TreeEnsembleParams - -import scala.collection.mutable -import scala.util.Try import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ import com.tencent.angel.ml.tree.conf.Strategy import com.tencent.angel.ml.tree.impurity.Impurity import org.apache.commons.logging.LogFactory +import scala.collection.mutable +import scala.util.Try + /** * Learning and dataset metadata for DecisionTree. * @@ -112,10 +111,10 @@ private[tree] object DecisionTreeMetadata { // We check the number of bins here against maxPossibleBins. // This needs to be checked here instead of in Strategy since maxPossibleBins can be modified // based on the number of training examples. - if (strategy.categoricalFeaturesInfo.nonEmpty) { - val maxCategoriesPerFeature = strategy.categoricalFeaturesInfo.values.max + if (strategy.categoricalFeatures.nonEmpty) { + val maxCategoriesPerFeature = strategy.categoricalFeatures.values.max val maxCategory = - strategy.categoricalFeaturesInfo.find(_._2 == maxCategoriesPerFeature).get._1 + strategy.categoricalFeatures.find(_._2 == maxCategoriesPerFeature).get._1 require(maxCategoriesPerFeature <= maxPossibleBins, s"DecisionTree requires maxBins (= $maxPossibleBins) to be at least as large as the " + s"number of values in each categorical feature, but categorical feature $maxCategory " + @@ -129,7 +128,7 @@ private[tree] object DecisionTreeMetadata { // Multiclass classification val maxCategoriesForUnorderedFeature = ((math.log(maxPossibleBins / 2 + 1) / math.log(2.0)) + 1).floor.toInt - strategy.categoricalFeaturesInfo.foreach { case (featureIndex, numCategories) => + strategy.categoricalFeatures.foreach { case (featureIndex, numCategories) => // Hack: If a categorical feature has only 1 category, we treat it as continuous. // TODO(SPARK-9957): Handle this properly by filtering out those features. if (numCategories > 1) { @@ -147,7 +146,7 @@ private[tree] object DecisionTreeMetadata { } } else { // Binary classification or regression - strategy.categoricalFeaturesInfo.foreach { case (featureIndex, numCategories) => + strategy.categoricalFeatures.foreach { case (featureIndex, numCategories) => // If a categorical feature has only 1 category, we treat it as continuous: SPARK-9957 if (numCategories > 1) { numBins(featureIndex) = numCategories @@ -189,8 +188,8 @@ private[tree] object DecisionTreeMetadata { } new DecisionTreeMetadata(numFeatures, numExamples, numClasses, numBins.max, - strategy.categoricalFeaturesInfo, unorderedFeatures.toSet, numBins, - strategy.impurity, strategy.quantileCalculationStrategy, strategy.maxDepth, + strategy.categoricalFeatures, unorderedFeatures.toSet, numBins, + strategy.impurity, strategy.quantileStrategy, strategy.maxDepth, strategy.minInstancesPerNode, strategy.minInfoGain, strategy.numTrees, numFeaturesPerNode) } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala similarity index 99% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala index 23e83fbad..37bf4e733 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.tree.impurity.ImpurityCalculator diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/NodeIdCache.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/NodeIdCache.scala index bcc565880..cefd13420 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/NodeIdCache.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/NodeIdCache.scala @@ -1,4 +1,6 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data + +import com.tencent.angel.ml.tree.data.{BaggedPoint, LearningNode, Split, TreePoint} import scala.collection.mutable diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Split.scala similarity index 99% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Split.scala index ffb051db8..6137972a4 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/Split.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Split.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import java.util.Objects diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreeParams.scala similarity index 99% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreeParams.scala index 43030db63..feaa2c68f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeParams.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreeParams.scala @@ -1,4 +1,4 @@ -package com.tencent.angel.ml.tree +package com.tencent.angel.ml.tree.data import java.util.Locale @@ -137,7 +137,7 @@ trait DecisionTreeParams { strategy.minInstancesPerNode = getMinInstancesPerNode strategy.useNodeIdCache = getCacheNodeIds strategy.numClasses = numClasses - strategy.categoricalFeaturesInfo = categoricalFeatures + strategy.categoricalFeatures = categoricalFeatures strategy.subSamplingRate = subsamplingRate strategy } @@ -233,7 +233,7 @@ trait DecisionTreeRegressorParams object TreeEnsembleParams { // These options should be lowercase. final val supportedFeatureSubsetStrategies: Array[String] = - Array("auto", "all", "onethird", "sqrt", "log2").map(_.toLowerCase(Locale.ROOT)) + Array("auto", "all", "onethird", "sqrt", "log2").map(_.toLowerCase) } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreePoint.scala similarity index 94% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreePoint.scala index 09f15e62f..8a60a507b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreePoint.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/TreePoint.scala @@ -1,11 +1,7 @@ -package com.tencent.angel.ml.tree.model +package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.model.{ContinuousSplit, Split} -import org.apache.spark.ml.feature.LabeledPoint -import com.tencent.angel.ml.tree.model.{ContinuousSplit, Split} -import com.tencent.angel.ml.tree.model.{DecisionTreeMetadata, TreePoint} /** * Internal representation of LabeledPoint for DecisionTree. From ae89439029303b38a2f47d32a87507e06e59d117 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 20 Nov 2018 19:14:11 +0800 Subject: [PATCH 011/115] models for DT and RF --- .../angel/ml/tree/DecisionTreeLearner.scala | 38 +- .../angel/ml/tree/RandomForestLearner.scala | 42 +-- .../ml/tree/RandomForestPredictTask.scala | 3 +- .../tree/{utils => }/RandomForestRunner.scala | 16 +- .../tencent/angel/ml/tree/TreeModels.scala | 357 ------------------ .../com/tencent/angel/ml/tree/loss/Loss.scala | 2 +- .../DecisionTreeClassificationModel.scala | 60 ++- .../ml/tree/model/DecisionTreeModel.scala | 131 +++++++ .../model/DecisionTreeRegressionModel.scala | 54 ++- .../angel/ml/tree/model/RandomForest.scala | 23 +- .../ml/tree/model/RandomForestModel.scala | 50 +++ .../ml/tree/model/TreeEnsembleModel.scala | 174 +++++++-- .../ml/tree/oldmodel/DecisionTreeModel.scala | 250 ------------ .../ml/tree/oldmodel/TreeEnsembleModels.scala | 197 ---------- 14 files changed, 435 insertions(+), 962 deletions(-) rename angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/{utils => }/RandomForestRunner.scala (76%) delete mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala delete mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala delete mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala index 6a1dfdd89..7bb681848 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/DecisionTreeLearner.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ import com.tencent.angel.ml.tree.conf.{Algo, Strategy} import com.tencent.angel.ml.tree.impurity._ -import com.tencent.angel.ml.tree.oldmodel._ +import com.tencent.angel.ml.tree.model.RandomForestModel import com.tencent.angel.worker.storage.DataBlock import com.tencent.angel.worker.task.TaskContext @@ -28,9 +28,7 @@ class DecisionTreeLearner (ctx: TaskContext, val strategy: Strategy, val seed: I * categorical), depth of the tree, quantile calculation strategy, etc. */ def this(ctx: TaskContext, strategy: Strategy) = this(ctx, strategy, seed = 0) - def this(ctx: TaskContext) = this(ctx, Strategy.defaultStrategy(Algo.Classification)) - - strategy.assertValid() + def this(ctx: TaskContext) = this(ctx, Strategy.initStrategy(ctx.getConf)) /** * Method to train a decision tree model over an RDD @@ -40,7 +38,9 @@ class DecisionTreeLearner (ctx: TaskContext, val strategy: Strategy, val seed: I */ override def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { - val rf = new RandomForestLearner(ctx, strategy, numTrees = 1, featureSubsetStrategy = "all", seed = seed) + strategy.setNumTrees(1) + strategy.setFeatureSamplingStrategy("all") + val rf = new RandomForestLearner(ctx, strategy, seed = seed) val rfModel = rf.train(trainBlock, validBlock) rfModel.asInstanceOf[RandomForestModel].trees(0) } @@ -96,7 +96,7 @@ object DecisionTree { algo: Algo, impurity: Impurity, maxDepth: Int): MLModel = { - val strategy = new Strategy(algo, impurity, maxDepth) + val strategy = new Strategy(algo, impurity, maxDepth = maxDepth) new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } @@ -126,7 +126,8 @@ object DecisionTree { impurity: Impurity, maxDepth: Int, numClasses: Int): MLModel = { - val strategy = new Strategy(algo, impurity, maxDepth, numClasses) + val strategy = new Strategy(algo, impurity, + maxDepth = maxDepth, numClasses = numClasses) new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } @@ -143,8 +144,8 @@ object DecisionTree { * 1 internal node + 2 leaf nodes). * @param numClasses Number of classes for classification. Default value of 2. * @param maxBins Maximum number of bins used for splitting features. - * @param quantileCalculationStrategy Algorithm for calculating quantiles. - * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * @param quantileStrategy Algorithm for calculating quantiles. + * @param categoricalFeatures Map storing arity of categorical features. An entry (n to k) * indicates that feature n is categorical with k categories * indexed from 0: {0, 1, ..., k-1}. * @return DecisionTreeModel that can be used for prediction. @@ -162,10 +163,12 @@ object DecisionTree { maxDepth: Int, numClasses: Int, maxBins: Int, - quantileCalculationStrategy: QuantileStrategy, - categoricalFeaturesInfo: Map[Int, Int]): MLModel = { - val strategy = new Strategy(algo, impurity, maxDepth, numClasses, maxBins, - quantileCalculationStrategy, categoricalFeaturesInfo) + quantileStrategy: QuantileStrategy, + categoricalFeatures: Map[Int, Int]): MLModel = { + val strategy = new Strategy(algo, impurity, + maxDepth = maxDepth, numClasses = numClasses, + maxBins = maxBins, quantileStrategy = quantileStrategy, + categoricalFeatures = categoricalFeatures) new DecisionTreeLearner(ctx, strategy).train(trainBlock, validBlock) } @@ -175,7 +178,7 @@ object DecisionTree { * @param trainBlock Training dataset: DataBlock of [[LabeledData]]. * Labels should take values {0, 1, ..., numClasses-1}. * @param numClasses Number of classes for classification. - * @param categoricalFeaturesInfo Map storing arity of categorical features. An entry (n to k) + * @param categoricalFeatures Map storing arity of categorical features. An entry (n to k) * indicates that feature n is categorical with k categories * indexed from 0: {0, 1, ..., k-1}. * @param impurity Criterion used for information gain calculation. @@ -192,13 +195,14 @@ object DecisionTree { trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData], numClasses: Int, - categoricalFeaturesInfo: Map[Int, Int], + categoricalFeatures: Map[Int, Int], impurity: String, maxDepth: Int, maxBins: Int): MLModel = { val impurityType = Impurities.fromString(impurity) - train(ctx, trainBlock, validBlock, Classification, impurityType, maxDepth, numClasses, maxBins, Sort, - categoricalFeaturesInfo) + train(ctx, trainBlock, validBlock, + Classification, impurityType, maxDepth, numClasses, + maxBins, Sort, categoricalFeatures) } /** diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index 953e3c890..454a4f3cd 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -1,17 +1,15 @@ package com.tencent.angel.ml.tree import com.tencent.angel.ml.core.MLLearner -import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel import scala.util.Random -import com.tencent.angel.ml.tree.model.{RandomForest => NewRandomForest} -import com.tencent.angel.ml.tree.conf.Algo._ +import com.tencent.angel.ml.tree.model.{DecisionTreeModel, RandomForest, RandomForestModel} +import com.tencent.angel.ml.tree.conf.Algo.{Algo, Classification, Regression} import com.tencent.angel.ml.tree.conf.QuantileStrategy._ -import com.tencent.angel.ml.tree.conf.{Algo, Strategy} +import com.tencent.angel.ml.tree.conf.Strategy import com.tencent.angel.ml.tree.impurity.Impurities -import com.tencent.angel.ml.tree.oldmodel._ import com.tencent.angel.worker.storage.DataBlock import com.tencent.angel.worker.task.TaskContext @@ -31,6 +29,7 @@ import scala.collection.mutable.ArrayBuffer * @see Breiman (2001) * @see * Breiman manual for random forests + * @param ctx Task context of Angel * @param strategy The configuration parameters for the random forest algorithm which specify * the type of random forest (classification or regression), feature type * (continuous, categorical), depth of the tree, quantile calculation strategy, @@ -39,33 +38,19 @@ import scala.collection.mutable.ArrayBuffer */ class RandomForestLearner ( override val ctx: TaskContext, - val strategy: Strategy = null, + val strategy: Strategy, val seed: Int) extends MLLearner(ctx) { - def initStrategy(): Unit = { - strategy.setAlgo(conf.get(MLConf.ML_TREE_TASK_TYPE, - MLConf.DEFAULT_ML_TREE_TASK_TYPE).toLowerCase) - strategy.setImpurity(conf.get(MLConf.ML_TREE_IMPURITY, - MLConf.DEFAULT_ML_TREE_IMPURITY).toLowerCase) - strategy.setNumTrees(conf.getInt(MLConf.ML_NUM_TREE, - MLConf.DEFAULT_ML_NUM_TREE)) - strategy.setMaxDepth(conf.getInt(MLConf.ML_TREE_MAX_DEPTH, - MLConf.DEFAULT_ML_TREE_MAX_DEPTH)) - strategy.setNumClasses(conf.getInt(MLConf.ML_NUM_CLASS, - MLConf.DEFAULT_ML_NUM_CLASS)) - strategy.setMaxBins(conf.getInt(MLConf.ML_TREE_MAX_BIN, - MLConf.DEFAULT_ML_TREE_MAX_BIN)) - strategy.setSubSamplingRate(conf.getDouble(MLConf.ML_TREE_SUB_SAMPLE_RATE, - MLConf.DEFAULT_ML_TREE_SUB_SAMPLE_RATE)) - strategy.setFeatureSamplingStrategy(conf.get(MLConf.ML_TREE_FEATURE_SAMPLE_STRATEGY, - MLConf.DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY)) - } + def this(ctx: TaskContext, strategy: Strategy) = this(ctx, strategy, seed = 0) + def this(ctx: TaskContext) = this(ctx, Strategy.initStrategy(ctx.getConf)) + + val model = null def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { input.resetReadIndex() val ret = new ArrayBuffer[LabeledData] - (0 until input.size()).foreach{ idx => + (0 until input.size()).foreach{ _ => ret += input.read() } ret.toArray @@ -79,14 +64,11 @@ class RandomForestLearner ( */ override def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { - if (strategy == null) initStrategy() - strategy.assertValid() val trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) val validDataSet: Array[LabeledData] = convertDataBlock(validBlock) - val trees: Array[DecisionTreeModel] = NewRandomForest.train(trainDataSet, validDataSet, strategy, seed.toLong) - new RandomForestModel(strategy.algo, trees.map(_.toOld), ctx.getConf, ctx) + val trees: Array[DecisionTreeModel] = RandomForest.train(ctx, trainDataSet, validDataSet, strategy, seed.toLong) + new RandomForestModel(strategy.algo, trees, ctx.getConf, ctx) } - } object RandomForestLearner { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala index c23971be8..c44527837 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestPredictTask.scala @@ -4,11 +4,12 @@ import com.tencent.angel.ml.core.PredictTask import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.worker.task.TaskContext import org.apache.hadoop.io.{LongWritable, Text} +import com.tencent.angel.ml.tree.model.RandomForestModel class RandomForestPredictTask (ctx: TaskContext) extends PredictTask[LongWritable, Text](ctx) { def predict(ctx: TaskContext) { - predict(ctx, RandomForestModel(ctx, conf), taskDataBlock); + predict(ctx, RandomForestModel(conf, ctx), taskDataBlock) } def parse(key: LongWritable, value: Text): LabeledData = { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala similarity index 76% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala index 36435a8ac..3380b3e45 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/utils/RandomForestRunner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala @@ -1,49 +1,45 @@ -package com.tencent.angel.ml.tree.utils +package com.tencent.angel.ml.tree import com.tencent.angel.client.AngelClientFactory import com.tencent.angel.ml.core.MLRunner import org.apache.commons.logging.LogFactory import org.apache.hadoop.conf.Configuration +import com.tencent.angel.ml.tree.model.RandomForestModel class RandomForestRunner extends MLRunner { - val LOG = LogFactory.getLog(classOf[RandomForestRunner]) override def train(conf: Configuration): Unit = { val client = AngelClientFactory.get(conf) - val model = new GBDTModel(conf) + val model = RandomForestModel(conf) try { client.startPSServer() client.loadModel(model) - client.runTask(classOf[GBDTTrainTask]) + client.runTask(classOf[RandomForestTrainTask]) client.waitForCompletion() client.saveModel(model) } finally { client.stop() } - - } override def predict(conf: Configuration) { conf.setInt("angel.worker.matrix.transfer.request.timeout.ms", 60000) val client = AngelClientFactory.get(conf) - val model = new GBDTModel(conf) + val model = RandomForestModel(conf) try { client.startPSServer() client.loadModel(model) - client.runTask(classOf[GBDTPredictTask]) + client.runTask(classOf[RandomForestPredictTask]) client.waitForCompletion() } finally { client.stop() } - - } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala deleted file mode 100644 index 1bd2fc94c..000000000 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/TreeModels.scala +++ /dev/null @@ -1,357 +0,0 @@ -package com.tencent.angel.ml.tree - -import com.tencent.angel.ml.math2.VFactory -import com.tencent.angel.ml.math2.vector.{IntDoubleVector, IntFloatVector} -import com.tencent.angel.ml.tree.DecisionTreeModelReadWrite.NodeData -import com.tencent.angel.ml.tree.model._ -import com.tencent.angel.ml.tree.impurity.ImpurityCalculator -import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} - -import scala.collection.mutable -import scala.reflect.ClassTag - -/** - * Abstraction for Decision Tree models. - */ -trait DecisionTreeModel { - - /** Root of the decision tree */ - def rootNode: Node - - /** Number of nodes in tree, including leaf nodes. */ - def numNodes: Int = { - 1 + rootNode.numDescendants - } - - /** - * Depth of the tree. - * E.g.: Depth 0 means 1 leaf node. Depth 1 means 1 internal node and 2 leaf nodes. - */ - lazy val depth: Int = { - rootNode.subtreeDepth - } - - /** Summary of the model */ - override def toString: String = { - // Implementing classes should generally override this method to be more descriptive. - s"DecisionTreeModel of depth $depth with $numNodes nodes" - } - - /** Full description of model */ - def toDebugString: String = { - val header = toString + "\n" - header + rootNode.subtreeToString(2) - } - - /** - * Trace down the tree, and return the largest feature index used in any split. - * - * @return Max feature index used in a split, or -1 if there are no splits (single leaf node). - */ - def maxSplitFeatureIndex(): Int = rootNode.maxSplitFeatureIndex() - - /** Convert to spark.mllib DecisionTreeModel (losing some information) */ - private[tree] def toOld: OldDecisionTreeModel -} - -/** - * Abstraction for models which are ensembles of decision trees - * - * TODO: Add support for predicting probabilities and raw predictions SPARK-3727 - * - * @tparam M Type of tree model in this ensemble - */ -private[tree] trait TreeEnsembleModel[M <: DecisionTreeModel] { - - // Note: We use getTrees since subclasses of TreeEnsembleModel will store subclasses of - // DecisionTreeModel. - - /** Trees in this ensemble. Warning: These have null parent Estimators. */ - def trees: Array[M] - - /** Weights for each tree, zippable with [[trees]] */ - def treeWeights: Array[Double] - - def treeWeightsVec: IntDoubleVector = VFactory.denseDoubleVector(treeWeights) - - /** Summary of the model */ - override def toString: String = { - // Implementing classes should generally override this method to be more descriptive. - s"TreeEnsembleModel with ${trees.length} trees" - } - - /** Full description of model */ - def toDebugString: String = { - val header = toString + "\n" - header + trees.zip(treeWeights).zipWithIndex.map { case ((tree, weight), treeIndex) => - s" Tree $treeIndex (weight $weight):\n" + tree.rootNode.subtreeToString(4) - }.fold("")(_ + _) - } - - /** Total number of nodes, summed over all trees in the ensemble. */ - lazy val totalNumNodes: Int = trees.map(_.numNodes).sum -} - -private[tree] object TreeEnsembleModel { - - /** - * Given a tree ensemble model, compute the importance of each feature. - * This generalizes the idea of "Gini" importance to other losses, - * following the explanation of Gini importance from "Random Forests" documentation - * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. - * - * For collections of trees, including boosting and bagging, Hastie et al. - * propose to use the average of single tree importances across all trees in the ensemble. - * - * This feature importance is calculated as follows: - * - Average over trees: - * - importance(feature j) = sum (over nodes which split on feature j) of the gain, - * where gain is scaled by the number of instances passing through node - * - Normalize importances for tree to sum to 1. - * - Normalize feature importance vector to sum to 1. - * - * References: - * - Hastie, Tibshirani, Friedman. "The Elements of Statistical Learning, 2nd Edition." 2001. - * - * @param trees Unweighted collection of trees - * @param numFeatures Number of features in model (even if not all are explicitly used by - * the model). - * If -1, then numFeatures is set based on the max feature index in all trees. - * @return Feature importance values, of length numFeatures. - */ - def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): IntFloatVector = { - val totalImportances = mutable.Map[Int, Float]() - trees.foreach { tree => - // Aggregate feature importance vector for this tree - val importances = mutable.Map[Int, Float]() - computeFeatureImportance(tree.rootNode, importances) - // Normalize importance vector for this tree, and add it to total. - // TODO: In the future, also support normalizing by tree.rootNode.impurityStats.count? - val treeNorm = importances.values.sum - if (treeNorm != 0) { - importances.foreach { case (idx, impt) => - val normImpt = impt / treeNorm - if (!totalImportances.contains(idx)) totalImportances += (idx -> normImpt) - else totalImportances.update(idx, totalImportances(idx) + normImpt) - } - } - } - // Normalize importances - normalizeMapValues(totalImportances) - // Construct vector - val d = if (numFeatures != -1) { - numFeatures - } else { - // Find max feature index used in trees - val maxFeatureIndex = trees.map(_.maxSplitFeatureIndex()).max - maxFeatureIndex + 1 - } - if (d == 0) { - assert(totalImportances.isEmpty, s"Unknown error in computing feature" + - s" importance: No splits found, but some non-zero importances.") - } - val (indices, values) = totalImportances.iterator.toSeq.sortBy(_._1).unzip - VFactory.sparseFloatVector(d, indices.toArray, values.toArray) - } - - /** - * Given a Decision Tree model, compute the importance of each feature. - * This generalizes the idea of "Gini" importance to other losses, - * following the explanation of Gini importance from "Random Forests" documentation - * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. - * - * This feature importance is calculated as follows: - * - importance(feature j) = sum (over nodes which split on feature j) of the gain, - * where gain is scaled by the number of instances passing through node - * - Normalize importances for tree to sum to 1. - * - * @param tree Decision tree to compute importances for. - * @param numFeatures Number of features in model (even if not all are explicitly used by - * the model). - * If -1, then numFeatures is set based on the max feature index in all trees. - * @return Feature importance values, of length numFeatures. - */ - def featureImportances[M <: DecisionTreeModel : ClassTag](tree: M, numFeatures: Int): IntFloatVector = { - featureImportances(Array(tree), numFeatures) - } - - /** - * Recursive method for computing feature importances for one tree. - * This walks down the tree, adding to the importance of 1 feature at each node. - * - * @param node Current node in recursion - * @param importances Aggregate feature importances, modified by this method - */ - def computeFeatureImportance( - node: Node, - importances: mutable.Map[Int, Float]): Unit = { - node match { - case n: InternalNode => - val feature = n.split.featureIndex - val scaledGain = n.gain * n.impurityStats.count - if (!importances.contains(feature)) importances += (feature -> scaledGain) - else importances.update(feature, importances(feature) + scaledGain) - computeFeatureImportance(n.leftChild, importances) - computeFeatureImportance(n.rightChild, importances) - case n: LeafNode => - // do nothing - } - } - - /** - * Normalize the values of this map to sum to 1, in place. - * If all values are 0, this method does nothing. - * - * @param map Map with non-negative values. - */ - def normalizeMapValues(map: mutable.Map[Int, Float]): Unit = { - val total = map.values.sum - if (total != 0) { - val keys = map.iterator.map(_._1).toArray - keys.foreach { key => - if (!map.contains(key)) map += (key -> 0.0f) else map.update(key, map(key) / total) - } - } - } -} - -/** Helper classes for tree model persistence */ -private[tree] object DecisionTreeModelReadWrite { - - /** - * Info for a [[org.apache.spark.ml.tree.Split]] - * - * @param featureIndex Index of feature split on - * @param leftCategoriesOrThreshold For categorical feature, set of leftCategories. - * For continuous feature, threshold. - * @param numCategories For categorical feature, number of categories. - * For continuous feature, -1. - */ - case class SplitData( - featureIndex: Int, - leftCategoriesOrThreshold: Array[Float], - numCategories: Int) { - - def getSplit: Split = { - if (numCategories != -1) { - new CategoricalSplit(featureIndex, leftCategoriesOrThreshold, numCategories) - } else { - assert(leftCategoriesOrThreshold.length == 1, s"DecisionTree split data expected" + - s" 1 threshold for ContinuousSplit, but found thresholds: " + - leftCategoriesOrThreshold.mkString(", ")) - new ContinuousSplit(featureIndex, leftCategoriesOrThreshold(0)) - } - } - } - - object SplitData { - def apply(split: Split): SplitData = split match { - case s: CategoricalSplit => - SplitData(s.featureIndex, s.leftCategories, s.numCategories) - case s: ContinuousSplit => - SplitData(s.featureIndex, Array(s.threshold), -1) - } - } - - /** - * Info for a [[Node]] - * - * @param id Index used for tree reconstruction. Indices follow a pre-order traversal. - * @param impurityStats Stats array. Impurity type is stored in metadata. - * @param gain Gain, or arbitrary value if leaf node. - * @param leftChild Left child index, or arbitrary value if leaf node. - * @param rightChild Right child index, or arbitrary value if leaf node. - * @param split Split info, or arbitrary value if leaf node. - */ - case class NodeData( - id: Int, - prediction: Float, - impurity: Float, - impurityStats: Array[Float], - gain: Float, - leftChild: Int, - rightChild: Int, - split: SplitData) - - object NodeData { - /** - * Create [[NodeData]] instances for this node and all children. - * - * @param id Current ID. IDs are assigned via a pre-order traversal. - * @return (sequence of nodes in pre-order traversal order, largest ID in subtree) - * The nodes are returned in pre-order traversal (root first) so that it is easy to - * get the ID of the subtree's root node. - */ - def build(node: Node, id: Int): (Seq[NodeData], Int) = node match { - case n: InternalNode => - val (leftNodeData, leftIdx) = build(n.leftChild, id + 1) - val (rightNodeData, rightIdx) = build(n.rightChild, leftIdx + 1) - val thisNodeData = NodeData(id, n.prediction, n.impurity, n.impurityStats.stats, - n.gain, leftNodeData.head.id, rightNodeData.head.id, SplitData(n.split)) - (thisNodeData +: (leftNodeData ++ rightNodeData), rightIdx) - case _: LeafNode => - (Seq(NodeData(id, node.prediction, node.impurity, node.impurityStats.stats, - -1.0f, -1, -1, SplitData(-1, Array.empty[Float], -1))), - id) - } - } - - /** - * Given all data for all nodes in a tree, rebuild the tree. - * @param data Unsorted node data - * @param impurityType Impurity type for this tree - * @return Root node of reconstructed tree - */ - def buildTreeFromNodes(data: Array[NodeData], impurityType: String): Node = { - // Load all nodes, sorted by ID. - val nodes = data.sortBy(_.id) - // Sanity checks; could remove - assert(nodes.head.id == 0, s"Decision Tree load failed. Expected smallest node ID to be 0," + - s" but found ${nodes.head.id}") - assert(nodes.last.id == nodes.length - 1, s"Decision Tree load failed. Expected largest" + - s" node ID to be ${nodes.length - 1}, but found ${nodes.last.id}") - // We fill `finalNodes` in reverse order. Since node IDs are assigned via a pre-order - // traversal, this guarantees that child nodes will be built before parent nodes. - val finalNodes = new Array[Node](nodes.length) - nodes.reverseIterator.foreach { case n: NodeData => - val impurityStats = ImpurityCalculator.getCalculator(impurityType, n.impurityStats) - val node = if (n.leftChild != -1) { - val leftChild = finalNodes(n.leftChild) - val rightChild = finalNodes(n.rightChild) - new InternalNode(n.prediction, n.impurity, n.gain, leftChild, rightChild, - n.split.getSplit, impurityStats) - } else { - new LeafNode(n.prediction, n.impurity, impurityStats) - } - finalNodes(n.id) = node - } - // Return the root node - finalNodes.head - } -} - -private[tree] object EnsembleModelReadWrite { - - /** - * Info for one [[Node]] in a tree ensemble - * - * @param treeID Tree index - * @param nodeData Data for this node - */ - case class EnsembleNodeData( - treeID: Int, - nodeData: NodeData) - - object EnsembleNodeData { - /** - * Create [[EnsembleNodeData]] instances for the given tree. - * - * @return Sequence of nodes for this tree - */ - def build(tree: DecisionTreeModel, treeID: Int): Seq[EnsembleNodeData] = { - val (nodeData: Seq[NodeData], _) = NodeData.build(tree.rootNode, 0) - nodeData.map(nd => EnsembleNodeData(treeID, nd)) - } - } -} - diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala index 0533e43b6..e9ce9e2d9 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/loss/Loss.scala @@ -2,7 +2,7 @@ package com.tencent.angel.ml.tree.loss import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.oldmodel.TreeEnsembleModel +import com.tencent.angel.ml.tree.model.TreeEnsembleModel /** * Trait for adding "pluggable" loss functions for the gradient boosting algorithm. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala index 3bcd7db73..87916f940 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeClassificationModel.scala @@ -2,10 +2,25 @@ package com.tencent.angel.ml.tree.model import com.tencent.angel.ml.math2.VFactory import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.{DecisionTreeClassifierParams, DecisionTreeModel, TreeEnsembleModel} -import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo} -import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} +import com.tencent.angel.ml.tree.conf.Algo +import com.tencent.angel.ml.tree.data.{DecisionTreeClassifierParams, Node} import com.tencent.angel.ml.tree.utils.ProbabilisticUtils +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration + +object DecisionTreeClassificationModel { + + def apply(topNode: Node, numFeatures: Int, + numClasses: Int, conf: Configuration): DecisionTreeClassificationModel = { + new DecisionTreeClassificationModel(topNode, numFeatures, numClasses, conf, _ctx = null) + } + + def apply(topNode: Node, numFeatures: Int, + numClasses: Int, conf: Configuration, ctx: TaskContext): DecisionTreeClassificationModel = { + new DecisionTreeClassificationModel(topNode, numFeatures, numClasses, conf, ctx) + } +} + /** * Decision tree model (http://en.wikipedia.org/wiki/Decision_tree_learning) for classification. @@ -13,18 +28,17 @@ import com.tencent.angel.ml.tree.utils.ProbabilisticUtils * features. */ private[tree] class DecisionTreeClassificationModel ( - val rootNode: Node, - val numFeatures: Int, - val numClasses: Int) - extends DecisionTreeModel with DecisionTreeClassifierParams with Serializable { + override val rootNode: Node, + val numFeatures: Int, + val numClasses: Int, + conf: Configuration, + _ctx: TaskContext) + extends DecisionTreeModel(rootNode, Algo.Classification, conf, _ctx) + with DecisionTreeClassifierParams with Serializable { require(rootNode != null, "DecisionTreeClassificationModel given null rootNode, but it requires a non-null rootNode.") - def predict(features: IntFloatVector): Float = { - rootNode.predictImpl(features).prediction - } - def predictRaw(features: IntFloatVector): IntFloatVector = { VFactory.denseFloatVector(rootNode.predictImpl(features).impurityStats.stats.clone()) } @@ -59,28 +73,6 @@ private[tree] class DecisionTreeClassificationModel ( * correlated predictor variables. Consider using a RandomForestClassifier * to determine feature importance instead. */ - lazy val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) - - /** Convert to spark.mllib DecisionTreeModel (losing some information) */ - override private[tree] def toOld: OldDecisionTreeModel = { - new OldDecisionTreeModel(rootNode.toOld(1), OldAlgo.Classification) - } - -} - -object DecisionTreeClassificationModel { - - /** Convert a model from the old API */ - private[ml] def fromOld( - oldModel: OldDecisionTreeModel, - categoricalFeatures: Map[Int, Int], - numFeatures: Int = -1): DecisionTreeClassificationModel = { - require(oldModel.algo == OldAlgo.Classification, - s"Cannot convert non-classification DecisionTreeModel (old API) to" + - s" DecisionTreeClassificationModel (new API). Algo is: ${oldModel.algo}") - val rootNode = Node.fromOld(oldModel.topNode, categoricalFeatures) - // Can't infer number of features from old model, so default to -1 - new DecisionTreeClassificationModel(rootNode, numFeatures, -1) - } + val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala new file mode 100644 index 000000000..8f4f6f365 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala @@ -0,0 +1,131 @@ +package com.tencent.angel.ml.tree.model + +import scala.beans.BeanProperty +import java.text.DecimalFormat + +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.model.MLModel +import com.tencent.angel.ml.predict.PredictResult +import com.tencent.angel.ml.tree.conf.Algo.{Algo, Classification, Regression} +import com.tencent.angel.ml.tree.data._ +import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration + +object DecisionTreeModel { + + val FEAT_CATEGORY_MAT = "gbdt.feature.category" + val SPLIT_FEAT_MAT: String = "gbdt.split.feature" + val SPLIT_VALUE_MAT: String = "gbdt.split.value" + val SPLIT_GAIN_MAT: String = "gbdt.split.gain" + val NODE_PRED_MAT: String = "gbdt.node.predict" + + def apply(topNode: Node, algo: Algo, conf: Configuration): DecisionTreeModel = { + new DecisionTreeModel(topNode, algo, conf, null) + } + + def apply(topNode: Node, algo: Algo, conf: Configuration, ctx: TaskContext): DecisionTreeModel = { + new DecisionTreeModel(topNode, algo, conf, ctx) + } +} + +/** + * Decision tree model for classification or regression. + * This model stores the decision tree structure and parameters. + * + * @param topNode root node + * @param algo algorithm type -- classification or regression + */ +class DecisionTreeModel ( + @BeanProperty var topNode: Node, + @BeanProperty var algo: Algo, + conf: Configuration, + _ctx: TaskContext) extends MLModel(conf, _ctx) { + + super.setSavePath(conf) + super.setLoadPath(conf) + + /** Root of the decision tree */ + def rootNode: Node = topNode + + /** Number of nodes in tree, including leaf nodes. */ + def numNodes: Int = { + 1 + topNode.numDescendants + } + + /** + * Depth of tree. + * E.g.: Depth 0 means 1 leaf node. Depth 1 means 1 internal node and 2 leaf nodes. + */ + def depth: Int = { + topNode.subtreeDepth + } + + override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { + val ret = new MemoryDataBlock[PredictResult](-1) + (0 until dataSet.size).foreach { idx => + val instance = dataSet.read + val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] + val y = instance.getY + val pred = predict(x) + ret.put(DecisionTreePredictResult(idx, y, pred)) + } + ret + } + + /** + * Predict values for a single data point using the model trained. + * + * @param features array representing a single data point + * @return Double prediction from the trained model + */ + def predict(features: IntFloatVector): Float = { + topNode.predictImpl(features).prediction + } + + /** + * Predict values for the given data set using the model trained. + * + * @param features RDD representing data points to be predicted + * @return RDD of predictions for each of the given data points + */ + def predict(features: List[IntFloatVector]): List[Float] = { + features.map(x => predict(x)) + } + + /** + * Trace down the tree, and return the largest feature index used in any split. + * + * @return Max feature index used in a split, or -1 if there are no splits (single leaf node). + */ + def maxSplitFeatureIndex(): Int = rootNode.maxSplitFeatureIndex() + + /** + * Print a summary of the model. + */ + override def toString: String = algo match { + case Classification => + s"DecisionTreeModel classifier of depth $depth with $numNodes nodes" + case Regression => + s"DecisionTreeModel regressor of depth $depth with $numNodes nodes" + case _ => throw new IllegalArgumentException( + s"DecisionTreeModel given unknown algo parameter: $algo.") + } + + /** + * Print the full model to a string. + */ + def toDebugString: String = { + val header = toString + "\n" + header + topNode.subtreeToString(2) + } +} + +case class DecisionTreePredictResult(sid: Long, pred: Double, label: Double) extends PredictResult { + val df = new DecimalFormat("0") + + override def getText: String = { + df.format(sid) + separator + format.format(pred) + separator + df.format(label) + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala index a2f812541..a1a2cd000 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeRegressionModel.scala @@ -2,12 +2,21 @@ package com.tencent.angel.ml.tree.model import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo} -import com.tencent.angel.ml.tree.TreeEnsembleModel -import com.tencent.angel.ml.tree.DecisionTreeModel -import com.tencent.angel.ml.tree.DecisionTreeRegressorParams -import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeModel} +import com.tencent.angel.ml.tree.conf.Algo +import com.tencent.angel.ml.tree.data.{DecisionTreeRegressorParams, Node} +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration +object DecisionTreeRegressionModel { + + def apply(topNode: Node, numFeatures: Int, conf: Configuration): DecisionTreeRegressionModel = { + new DecisionTreeRegressionModel(topNode, numFeatures, conf, _ctx = null) + } + + def apply(topNode: Node, numFeatures: Int, conf: Configuration, ctx: TaskContext): DecisionTreeRegressionModel = { + new DecisionTreeRegressionModel(topNode, numFeatures, conf, ctx) + } +} /** * @@ -16,17 +25,16 @@ import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel => OldDecisionTreeM * @param rootNode Root of the decision tree */ private[tree] class DecisionTreeRegressionModel ( - val rootNode: Node, - val numFeatures: Int) - extends DecisionTreeModel with DecisionTreeRegressorParams { + override val rootNode: Node, + val numFeatures: Int, + conf: Configuration, + _ctx: TaskContext) + extends DecisionTreeModel(rootNode, Algo.Regression, conf, _ctx) + with DecisionTreeRegressorParams { require(rootNode != null, "DecisionTreeRegressionModel given null rootNode, but it requires a non-null rootNode.") - def predict(features: IntFloatVector): Float = { - rootNode.predictImpl(features).prediction - } - /** We need to update this function if we ever add other impurity measures. */ def predictVariance(features: IntFloatVector): Float = { rootNode.predictImpl(features).impurityStats.calculate() @@ -52,26 +60,6 @@ private[tree] class DecisionTreeRegressionModel ( * correlated predictor variables. Consider using a RandomForestRegressor * to determine feature importance instead. */ - lazy val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) - - /** Convert to spark.mllib DecisionTreeModel (losing some information) */ - def toOld: OldDecisionTreeModel = { - new OldDecisionTreeModel(rootNode.toOld(1), OldAlgo.Regression) - } -} - -object DecisionTreeRegressionModel { - - /** Convert a model from the old API */ - private[ml] def fromOld( - oldModel: OldDecisionTreeModel, - categoricalFeatures: Map[Int, Int], - numFeatures: Int = -1): DecisionTreeRegressionModel = { - require(oldModel.algo == OldAlgo.Regression, - s"Cannot convert non-regression DecisionTreeModel (old API) to" + - s" DecisionTreeRegressionModel (new API). Algo is: ${oldModel.algo}") - val rootNode = Node.fromOld(oldModel.topNode, categoricalFeatures) - new DecisionTreeRegressionModel(rootNode, numFeatures) - } + val featureImportances: IntFloatVector = TreeEnsembleModel.featureImportances(this, numFeatures) } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala index 7df62b42f..47234c0c1 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -5,10 +5,11 @@ import scala.util.Random import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.tree.utils.{SamplingUtils, TimeTracker} -import com.tencent.angel.ml.tree.DecisionTreeModel import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo, Strategy => OldStrategy} +import com.tencent.angel.ml.tree.data._ import com.tencent.angel.ml.tree.impurity.ImpurityCalculator import com.tencent.angel.ml.tree.oldmodel.ImpurityStats +import com.tencent.angel.worker.task.TaskContext import org.apache.commons.logging.LogFactory /** @@ -64,12 +65,12 @@ private[tree] object RandomForest { * @return an unweighted set of trees */ def train( - trainData: Array[LabeledData], - validData: Array[LabeledData], - strategy: OldStrategy, - seed: Long, - // exposed for testing only, real trees are always prune - prune: Boolean = true): Array[DecisionTreeModel] = { + ctx: TaskContext, + trainData: Array[LabeledData], + validData: Array[LabeledData], + strategy: OldStrategy, seed: Long, + // exposed for testing only, real trees are always prune + prune: Boolean = true): Array[DecisionTreeModel] = { val timer = new TimeTracker() @@ -102,7 +103,7 @@ private[tree] object RandomForest { val withReplacement = strategy.numTrees > 1 val baggedInput = BaggedPoint - .convertToBaggedRDD(trainTreeInput, strategy.subSamplingRate, numTrees, withReplacement, seed) + .convertToBaggedRDD(trainTreeInput, strategy.subSamplingRate, strategy.numTrees, withReplacement, seed) // depth of the decision tree val maxDepth = strategy.maxDepth @@ -179,12 +180,12 @@ private[tree] object RandomForest { if (strategy.algo == OldAlgo.Classification) { topNodes.map { rootNode => - new DecisionTreeClassificationModel(rootNode.toNode(prune), numFeatures, - strategy.getNumClasses) + DecisionTreeClassificationModel(rootNode.toNode(prune), numFeatures, + strategy.getNumClasses, ctx.getConf) } } else { topNodes.map(rootNode => - new DecisionTreeRegressionModel(rootNode.toNode(prune), numFeatures)) + DecisionTreeRegressionModel(rootNode.toNode(prune), numFeatures, ctx.getConf)) } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala new file mode 100644 index 000000000..4460e5e79 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala @@ -0,0 +1,50 @@ +package com.tencent.angel.ml.tree.model + +import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.ml.tree.conf.Algo +import com.tencent.angel.ml.tree.conf.Algo.{Algo, Classification} +import com.tencent.angel.ml.tree.conf.EnsembleStrategy.{Average, Vote} +import com.tencent.angel.worker.task.TaskContext +import org.apache.hadoop.conf.Configuration + +object RandomForestModel { + + def apply(conf: Configuration): RandomForestModel = { + RandomForestModel(conf, null) + } + + def apply(conf: Configuration, _ctx: TaskContext): RandomForestModel = { + val algo = conf.get(MLConf.ML_TREE_TASK_TYPE, + MLConf.DEFAULT_ML_TREE_TASK_TYPE) + val numTrees = conf.getInt(MLConf.ML_NUM_TREE, + MLConf.DEFAULT_ML_NUM_TREE) + RandomForestModel(Algo.fromString(algo), new Array[DecisionTreeModel](numTrees), conf, _ctx) + } + + def apply(algo: Algo, trees: Array[DecisionTreeModel], + conf: Configuration): RandomForestModel = { + RandomForestModel(algo, trees, conf, _ctx =null) + } + + def apply(algo: Algo, trees: Array[DecisionTreeModel], conf: Configuration, _ctx: TaskContext): RandomForestModel = { + new RandomForestModel(algo, trees, conf, _ctx) + } +} + + +/** + * Represents a random forest model. + * + * @param algo algorithm for the ensemble model, either Classification or Regression + * @param trees tree ensembles + */ +class RandomForestModel ( + override val algo: Algo, + override val trees: Array[DecisionTreeModel], + conf: Configuration, + _ctx: TaskContext) + extends TreeEnsembleModel(algo, trees, Array.fill(trees.length)(1.0), + combiningStrategy = if (algo == Classification) Vote else Average, conf, _ctx) { + + require(trees.forall(_.algo == algo)) +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala index 372354c31..08e8fa79c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala @@ -1,17 +1,149 @@ package com.tencent.angel.ml.tree.model import com.tencent.angel.ml.feature.LabeledData -import com.tencent.angel.ml.math2.vector.IntFloatVector +import com.tencent.angel.ml.math2.VFactory +import com.tencent.angel.ml.math2.vector.{IntDoubleVector, IntFloatVector} import com.tencent.angel.ml.model.MLModel import com.tencent.angel.ml.predict.PredictResult import com.tencent.angel.ml.tree.conf.Algo.{Algo, Classification, Regression} -import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy.{Average, EnsembleCombiningStrategy, Sum, Vote} -import com.tencent.angel.ml.tree.oldmodel.{DecisionTreeModel, DecisionTreePredictResult} +import com.tencent.angel.ml.tree.conf.EnsembleStrategy.{Average, EnsembleStrategy, Sum, Vote} +import com.tencent.angel.ml.tree.data._ import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} import com.tencent.angel.worker.task.TaskContext import org.apache.hadoop.conf.Configuration import scala.collection.mutable +import scala.reflect.ClassTag + +private[tree] object TreeEnsembleModel { + + case class Metadata( + algo: String, + treeAlgo: String, + combiningStrategy: String, + treeWeights: Array[Double]) + + /** + * Given a tree ensemble model, compute the importance of each feature. + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * For collections of trees, including boosting and bagging, Hastie et al. + * propose to use the average of single tree importances across all trees in the ensemble. + * + * This feature importance is calculated as follows: + * - Average over trees: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * - Normalize feature importance vector to sum to 1. + * + * References: + * - Hastie, Tibshirani, Friedman. "The Elements of Statistical Learning, 2nd Edition." 2001. + * + * @param trees Unweighted collection of trees + * @param numFeatures Number of features in model (even if not all are explicitly used by + * the model). + * If -1, then numFeatures is set based on the max feature index in all trees. + * @return Feature importance values, of length numFeatures. + */ + def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): IntFloatVector = { + val totalImportances = mutable.Map[Int, Float]() + trees.foreach { tree => + // Aggregate feature importance vector for this tree + val importances = mutable.Map[Int, Float]() + computeFeatureImportance(tree.rootNode, importances) + // Normalize importance vector for this tree, and add it to total. + // TODO: In the future, also support normalizing by tree.rootNode.impurityStats.count? + val treeNorm = importances.values.sum + if (treeNorm != 0) { + importances.foreach { case (idx, impt) => + val normImpt = impt / treeNorm + if (!totalImportances.contains(idx)) totalImportances += (idx -> normImpt) + else totalImportances.update(idx, totalImportances(idx) + normImpt) + } + } + } + // Normalize importances + normalizeMapValues(totalImportances) + // Construct vector + val d = if (numFeatures != -1) { + numFeatures + } else { + // Find max feature index used in trees + val maxFeatureIndex = trees.map(_.maxSplitFeatureIndex()).max + maxFeatureIndex + 1 + } + if (d == 0) { + assert(totalImportances.isEmpty, s"Unknown error in computing feature" + + s" importance: No splits found, but some non-zero importances.") + } + val (indices, values) = totalImportances.iterator.toSeq.sortBy(_._1).unzip + VFactory.sparseFloatVector(d, indices.toArray, values.toArray) + } + + /** + * Given a Decision Tree model, compute the importance of each feature. + * This generalizes the idea of "Gini" importance to other losses, + * following the explanation of Gini importance from "Random Forests" documentation + * by Leo Breiman and Adele Cutler, and following the implementation from scikit-learn. + * + * This feature importance is calculated as follows: + * - importance(feature j) = sum (over nodes which split on feature j) of the gain, + * where gain is scaled by the number of instances passing through node + * - Normalize importances for tree to sum to 1. + * + * @param tree Decision tree to compute importances for. + * @param numFeatures Number of features in model (even if not all are explicitly used by + * the model). + * If -1, then numFeatures is set based on the max feature index in all trees. + * @return Feature importance values, of length numFeatures. + */ + def featureImportances[M <: DecisionTreeModel : ClassTag](tree: M, numFeatures: Int): IntFloatVector = { + featureImportances(Array(tree), numFeatures) + } + + /** + * Recursive method for computing feature importances for one tree. + * This walks down the tree, adding to the importance of 1 feature at each node. + * + * @param node Current node in recursion + * @param importances Aggregate feature importances, modified by this method + */ + def computeFeatureImportance( + node: Node, + importances: mutable.Map[Int, Float]): Unit = { + node match { + case n: InternalNode => + val feature = n.split.featureIndex + val scaledGain = n.gain * n.impurityStats.count + if (!importances.contains(feature)) importances += (feature -> scaledGain) + else importances.update(feature, importances(feature) + scaledGain) + computeFeatureImportance(n.leftChild, importances) + computeFeatureImportance(n.rightChild, importances) + case n: LeafNode => + // do nothing + } + } + + /** + * Normalize the values of this map to sum to 1, in place. + * If all values are 0, this method does nothing. + * + * @param map Map with non-negative values. + */ + def normalizeMapValues(map: mutable.Map[Int, Float]): Unit = { + val total = map.values.sum + if (total != 0) { + val keys = map.iterator.map(_._1).toArray + keys.foreach { key => + if (!map.contains(key)) map += (key -> 0.0f) else map.update(key, map(key) / total) + } + } + } +} + /** * Represents a tree ensemble model. @@ -21,32 +153,32 @@ import scala.collection.mutable * @param treeWeights tree ensemble weights * @param combiningStrategy strategy for combining the predictions, not used for regression. */ -sealed class TreeEnsembleModel( +class TreeEnsembleModel( protected val algo: Algo, protected val trees: Array[DecisionTreeModel], protected val treeWeights: Array[Double], - protected val combiningStrategy: EnsembleCombiningStrategy, - conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { - - require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") + protected val combiningStrategy: EnsembleStrategy, + conf: Configuration, + _ctx: TaskContext) + extends MLModel(conf, _ctx) { + var treeWeightsVec: IntDoubleVector = VFactory.denseDoubleVector(treeWeights) private val sumWeights = math.max(treeWeights.sum, 1e-15) + require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") + super.setSavePath(conf) super.setLoadPath(conf) override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { val ret = new MemoryDataBlock[PredictResult](-1) - (0 until dataSet.size).foreach { idx => val instance = dataSet.read val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] val y = instance.getY val pred = predict(x) - ret.put(DecisionTreePredictResult(idx, y, pred)) } - ret } @@ -111,6 +243,16 @@ sealed class TreeEnsembleModel( predict(features.toList).toArray } + /** + * Get number of trees in ensemble. + */ + def numTrees: Int = trees.length + + /** + * Get total number of nodes, summed over all trees in the ensemble. + */ + def totalNumNodes: Int = trees.map(_.numNodes).sum + /** * Print a summary of the model. */ @@ -134,14 +276,4 @@ sealed class TreeEnsembleModel( s" Tree $treeIndex:\n" + tree.topNode.subtreeToString(4) }.fold("")(_ + _) } - - /** - * Get number of trees in ensemble. - */ - def numTrees: Int = trees.length - - /** - * Get total number of nodes, summed over all trees in the ensemble. - */ - def totalNumNodes: Int = trees.map(_.numNodes).sum } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala deleted file mode 100644 index 565cae7f8..000000000 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/DecisionTreeModel.scala +++ /dev/null @@ -1,250 +0,0 @@ -package com.tencent.angel.ml.tree.oldmodel - -import java.text.DecimalFormat - -import scala.collection.mutable -import scala.beans.BeanProperty -import org.apache.hadoop.conf.Configuration -import com.tencent.angel.ml.feature.LabeledData -import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.model.MLModel -import com.tencent.angel.ml.predict.PredictResult -import com.tencent.angel.ml.tree.conf.Algo._ -import com.tencent.angel.ml.tree.conf.FeatureType -import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} -import com.tencent.angel.worker.task.TaskContext - -object DecisionTreeModel { - - val SKETCH_MAT: String = "gbdt.sketch" - val FEAT_SAMPLE_MAT: String = "gbdt.feature.sample" - val FEAT_CATEGORY_MAT = "gbdt.feature.category" - val SPLIT_FEAT_MAT: String = "gbdt.split.feature" - val SPLIT_VALUE_MAT: String = "gbdt.split.value" - val SPLIT_GAIN_MAT: String = "gbdt.split.gain" - val NODE_PRED_MAT: String = "gbdt.node.predict" - - def apply(topNode: Node, algo: Algo, conf: Configuration) = { - new DecisionTreeModel(topNode, algo, conf) - } - - def apply(topNode: Node, algo: Algo, conf: Configuration, ctx: TaskContext) = { - new DecisionTreeModel(topNode, algo, conf, ctx) - } - - object DataStruct { - - case class PredictData(predict: Float, prob: Float) { - def toPredict: Predict = new Predict(predict, prob) - } - - object PredictData { - def apply(p: Predict): PredictData = PredictData(p.predict, p.prob) - - def apply(vec: IntFloatVector): PredictData = PredictData(vec.get(3), vec.get(4)) - } - - case class SplitData( - feature: Int, - threshold: Float, - featureType: Int, - categories: Seq[Float]) { - def toSplit: Split = { - Split(feature, threshold, FeatureType(featureType), categories.toList) - } - } - - object SplitData { - def apply(s: Split): SplitData = { - SplitData(s.feature, s.threshold, s.featureType.id, s.categories) - } - - def apply(vec: IntFloatVector): SplitData = { - SplitData(vec.get(9).toInt, vec.get(10), vec.get(11).toInt, vec.get((12 to vec.dim.toInt).toArray)) - } - } - - /** Model data for model import/export - * 0: treeId - * 1: nodeId (-1 means null) - * 2: pred - * 3: pred_prob - * 4: impurity - * 5: isLeaf (1=true) - * 6: leafChildId (-1 means null) - * 7: rightChildId (-1 means null) - * 8: infoGain - * 9: splitFeature - * 10: splitThreshold - * 11: splitType - * 12 to end: categories - * */ - case class NodeData( - treeId: Int, - nodeId: Int, - predict: PredictData, - impurity: Float, - isLeaf: Boolean, - leftNodeId: Option[Int], - rightNodeId: Option[Int], - infoGain: Option[Float], - split: Option[SplitData]) - - object NodeData { - def apply(treeId: Int, n: Node): NodeData = { - NodeData(treeId, n.id, PredictData(n.predict), n.impurity, n.isLeaf, n.leftNode.map(_.id), n.rightNode.map(_.id), - n.stats.map(_.gain), n.split.map(SplitData.apply)) - } - - def apply(vec: IntFloatVector): NodeData = { - val leftNodeId = if (vec.get(6) == -1) None else Some(vec.get(6).toInt) - val rightNodeId = if (vec.get(7) == -1) None else Some(vec.get(7).toInt) - val infoGain = if (vec.get(8) < 0) None else Some(vec.get(8)) - val split = if (vec.get(9) == -1) None else Some(SplitData(vec)) - NodeData(vec.get(0).toInt, vec.get(1).toInt, PredictData(vec), vec.get(4), - vec.get(5) == 1.0, leftNodeId, rightNodeId, infoGain, split) - } - } - - def constructTrees(nodes: List[NodeData]): Array[Node] = { - val trees: List[(Int, Node)] = nodes.groupBy(_.treeId) - .mapValues(_.toArray) - .map { case (treeId, data) => - (treeId, constructTree(data)) - }.toList.sortBy(_._1) - val numTrees = trees.length - val treeIndices = trees.map(_._1) - assert(treeIndices == (0 until numTrees).toList, - s"Tree indices must start from 0 and increment by 1, but we found $treeIndices.") - trees.map(_._2).toArray - } - - /** - * Given a list of nodes from a tree, construct the tree. - * @param data array of all node data in a tree. - */ - def constructTree(data: Array[NodeData]): Node = { - val dataMap: Map[Int, NodeData] = data.map(n => n.nodeId -> n).toMap - assert(dataMap.contains(1), - s"DecisionTree missing root node (id = 1).") - constructNode(1, dataMap, mutable.Map.empty) - } - - /** - * Builds a node from the node data map and adds new nodes to the input nodes map. - */ - private def constructNode( - id: Int, - dataMap: Map[Int, NodeData], - nodes: mutable.Map[Int, Node]): Node = { - if (nodes.contains(id)) { - return nodes(id) - } - val data = dataMap(id) - val node = - if (data.isLeaf) { - Node(data.nodeId, data.predict.toPredict, data.impurity, data.isLeaf) - } else { - val leftNode = constructNode(data.leftNodeId.get, dataMap, nodes) - val rightNode = constructNode(data.rightNodeId.get, dataMap, nodes) - val stats = new InformationGainStats(data.infoGain.get, data.impurity, leftNode.impurity, - rightNode.impurity, leftNode.predict, rightNode.predict) - new Node(data.nodeId, data.predict.toPredict, data.impurity, data.isLeaf, - data.split.map(_.toSplit), Some(leftNode), Some(rightNode), Some(stats)) - } - nodes += node.id -> node - node - } - } - -} - -/** - * Decision tree model for classification or regression. - * This model stores the decision tree structure and parameters. - * @param topNode root node - * @param algo algorithm type -- classification or regression - */ -class DecisionTreeModel (@BeanProperty val topNode: Node, val algo: Algo, conf: Configuration = null, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { - - super.setSavePath(conf) - super.setLoadPath(conf) - - override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { - val ret = new MemoryDataBlock[PredictResult](-1) - - (0 until dataSet.size).foreach { idx => - val instance = dataSet.read - val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] - val y = instance.getY - val pred = predict(x) - - ret.put(DecisionTreePredictResult(idx, y, pred)) - } - - ret - } - - /** - * Predict values for a single data point using the model trained. - * - * @param features array representing a single data point - * @return Double prediction from the trained model - */ - def predict(features: IntFloatVector): Double = { - topNode.predict(features) - } - - /** - * Predict values for the given data set using the model trained. - * - * @param features RDD representing data points to be predicted - * @return RDD of predictions for each of the given data points - */ - def predict(features: List[IntFloatVector]): List[Double] = { - features.map(x => predict(x)) - } - - /** - * Get number of nodes in tree, including leaf nodes. - */ - def numNodes: Int = { - 1 + topNode.numDescendants - } - - /** - * Get depth of tree. - * E.g.: Depth 0 means 1 leaf node. Depth 1 means 1 internal node and 2 leaf nodes. - */ - def depth: Int = { - topNode.subtreeDepth - } - - /** - * Print a summary of the model. - */ - override def toString: String = algo match { - case Classification => - s"DecisionTreeModel classifier of depth $depth with $numNodes nodes" - case Regression => - s"DecisionTreeModel regressor of depth $depth with $numNodes nodes" - case _ => throw new IllegalArgumentException( - s"DecisionTreeModel given unknown algo parameter: $algo.") - } - - /** - * Print the full model to a string. - */ - def toDebugString: String = { - val header = toString + "\n" - header + topNode.subtreeToString(2) - } -} - -case class DecisionTreePredictResult(sid: Long, pred: Double, label: Double) extends PredictResult { - val df = new DecimalFormat("0") - - override def getText: String = { - df.format(sid) + separator + format.format(pred) + separator + df.format(label) - } -} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala deleted file mode 100644 index 9cd2f707e..000000000 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/TreeEnsembleModels.scala +++ /dev/null @@ -1,197 +0,0 @@ -package com.tencent.angel.ml.tree.oldmodel - -import org.apache.hadoop.conf.Configuration - -import scala.collection.mutable -import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.model.MLModel -import com.tencent.angel.ml.predict.PredictResult -import com.tencent.angel.ml.feature.LabeledData -import com.tencent.angel.ml.tree -import com.tencent.angel.ml.tree.conf.Algo._ -import com.tencent.angel.ml.tree.conf.EnsembleCombiningStrategy._ -import com.tencent.angel.worker.storage.{DataBlock, MemoryDataBlock} -import com.tencent.angel.worker.task.TaskContext - -/** - * Represents a random forest model. - * - * @param algo algorithm for the ensemble model, either Classification or Regression - * @param trees tree ensembles - */ -class RandomForestModel ( - override val algo: Algo, - override val trees: Array[DecisionTreeModel], - conf: Configuration, _ctx: TaskContext = null) - extends TreeEnsembleModel(algo, trees, Array.fill(trees.length)(1.0), - combiningStrategy = if (algo == Classification) Vote else Average, conf, _ctx) { - - require(trees.forall(_.algo == algo)) -} - -/** - * Represents a tree ensemble model. - * - * @param algo algorithm for the ensemble model, either Classification or Regression - * @param trees tree ensembles - * @param treeWeights tree ensemble weights - * @param combiningStrategy strategy for combining the predictions, not used for regression. - */ -sealed class TreeEnsembleModel( - protected val algo: Algo, - protected val trees: Array[DecisionTreeModel], - protected val treeWeights: Array[Double], - protected val combiningStrategy: EnsembleCombiningStrategy, - conf: Configuration, _ctx: TaskContext = null) extends MLModel(conf, _ctx) { - - require(numTrees > 0, "TreeEnsembleModel cannot be created without trees.") - - private val sumWeights = math.max(treeWeights.sum, 1e-15) - - super.setSavePath(conf) - super.setLoadPath(conf) - - override def predict(dataSet: DataBlock[LabeledData]): DataBlock[PredictResult] = { - val ret = new MemoryDataBlock[PredictResult](-1) - - (0 until dataSet.size).foreach { idx => - val instance = dataSet.read - val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] - val y = instance.getY - val pred = predict(x) - - ret.put(DecisionTreePredictResult(idx, y, pred)) - } - - ret - } - - /** - * Predicts for a single data point using the weighted sum of ensemble predictions. - * - * @param features array representing a single data point - * @return predicted category from the trained model - */ - private def predictBySumming(features: IntFloatVector): Double = { - trees.zip(treeWeights).map{ case (tree, weight) => - tree.predict(features) * weight - }.sum - } - - /** - * Classifies a single data point based on (weighted) majority votes. - */ - private def predictByVoting(features: IntFloatVector): Double = { - val votes = mutable.Map.empty[Int, Double] - trees.view.zip(treeWeights).foreach { case (tree, weight) => - val prediction = tree.predict(features).toInt - votes(prediction) = votes.getOrElse(prediction, 0.0) + weight - } - votes.maxBy(_._2)._1 - } - - /** - * Predict values for a single data point using the model trained. - * - * @param features array representing a single data point - * @return predicted category from the trained model - */ - def predict(features: IntFloatVector): Double = { - (algo, combiningStrategy) match { - case (Regression, Sum) => - predictBySumming(features) - case (Regression, Average) => - predictBySumming(features) / sumWeights - case (Classification, Sum) => // binary classification - val prediction = predictBySumming(features) - // TODO: predicted labels are +1 or -1 for GBT. Need a better way to store this info. - if (prediction > 0.0) 1.0 else 0.0 - case (Classification, Vote) => - predictByVoting(features) - case _ => - throw new IllegalArgumentException( - "TreeEnsembleModel given unsupported (algo, combiningStrategy) combination: " + - s"($algo, $combiningStrategy).") - } - } - - /** - * Predict values for the given data set. - * - * @param features RDD representing data points to be predicted - * @return RDD[Double] where each entry contains the corresponding prediction - */ - def predict(features: List[IntFloatVector]): List[Double] = features.map(x => predict(x)) - - def predict(features: Array[IntFloatVector]): Array[Double] = { - predict(features.toList).toArray - } - - /** - * Print a summary of the model. - */ - override def toString: String = { - algo match { - case Classification => - s"TreeEnsembleModel classifier with $numTrees trees\n" - case Regression => - s"TreeEnsembleModel regressor with $numTrees trees\n" - case _ => throw new IllegalArgumentException( - s"TreeEnsembleModel given unknown algo parameter: $algo.") - } - } - - /** - * Print the full model to a string. - */ - def toDebugString: String = { - val header = toString + "\n" - header + trees.zipWithIndex.map { case (tree, treeIndex) => - s" Tree $treeIndex:\n" + tree.topNode.subtreeToString(4) - }.fold("")(_ + _) - } - - /** - * Get number of trees in ensemble. - */ - def numTrees: Int = trees.length - - /** - * Get total number of nodes, summed over all trees in the ensemble. - */ - def totalNumNodes: Int = trees.map(_.numNodes).sum -} - -object TreeEnsembleModel { - - object SaveUtils { - - import com.tencent.angel.ml.tree.oldmodel.DecisionTreeModel.DataStruct.NodeData - - case class Metadata( - algo: String, - treeAlgo: String, - combiningStrategy: String, - treeWeights: Array[Double]) - - /** - * Model data for model import/export. - * We have to duplicate NodeData here since Spark SQL does not yet support extracting subfields - * of nested fields; once that is possible, we can use something like: - * case class EnsembleNodeData(treeId: Int, node: NodeData), - * where NodeData is from DecisionTreeModel. - */ - case class EnsembleNodeData(treeId: Int, node: NodeData) - - /** - * Load trees for an ensemble, and return them in order. - * @param path path to load the model from - * @param treeAlgo Algorithm for individual trees (which may differ from the ensemble's - * algorithm). - */ - def loadTrees( - path: String, - treeAlgo: String): Array[tree.DecisionTreeModel] = ??? - } - -} From fdb79905ff1361ab07da8873e35408d26b0f1119 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 21 Nov 2018 17:27:16 +0800 Subject: [PATCH 012/115] improve basic data structure --- .../ml/tree/data/DTStatsAggregator.scala | 3 +- .../angel/ml/tree/data/InfoGainStats.scala | 48 ++++++++ .../com/tencent/angel/ml/tree/data/Node.scala | 6 +- .../ml/tree/impurity/ImpurityStats.scala | 61 ++++++++++ .../tree/oldmodel/InformationGainStats.scala | 106 ------------------ .../tencent/angel/ml/tree/oldmodel/Node.scala | 3 +- 6 files changed, 115 insertions(+), 112 deletions(-) create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/InfoGainStats.scala create mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/ImpurityStats.scala delete mode 100644 angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala index 00fd1c458..72ed0a6a3 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala @@ -60,7 +60,7 @@ private[tree] class DTStatsAggregator( /** * Array of parent node sufficient stats. * Note: parent stats need to be explicitly tracked in the [[DTStatsAggregator]] for unordered - * categorical features, because the parent [[Node]] object does not have [[com.tencent.angel.ml.tree.oldmodel.ImpurityStats]] + * categorical features, because the parent [[Node]] object does not have [[ImpurityStats]] * on the first iteration. */ private val parentStats: Array[Float] = new Array[Float](statsSize) @@ -141,7 +141,6 @@ private[tree] class DTStatsAggregator( s"DTStatsAggregator.merge requires that both aggregators have the same length stats vectors." + s" This aggregator is of length $allStatsSize, but the other is ${other.allStatsSize}.") var i = 0 - // TODO: Test BLAS.axpy while (i < allStatsSize) { allStats(i) += other.allStats(i) i += 1 diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/InfoGainStats.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/InfoGainStats.scala new file mode 100644 index 000000000..273adad68 --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/InfoGainStats.scala @@ -0,0 +1,48 @@ +package com.tencent.angel.ml.tree.data + +import com.tencent.angel.ml.tree.oldmodel.Predict + +/** + * Information gain statistics for each split + * @param gain information gain value + * @param impurity current node impurity + * @param leftImpurity left node impurity + * @param rightImpurity right node impurity + * @param leftPredict left node predict + * @param rightPredict right node predict + */ +class InfoGainStats( + val gain: Float, + val impurity: Float, + val leftImpurity: Float, + val rightImpurity: Float, + val leftPredict: Predict, + val rightPredict: Predict) extends Serializable { + + override def toString: String = { + s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + + s"right impurity = $rightImpurity" + } + + override def equals(o: Any): Boolean = o match { + case other: InfoGainStats => + gain == other.gain && + impurity == other.impurity && + leftImpurity == other.leftImpurity && + rightImpurity == other.rightImpurity && + leftPredict == other.leftPredict && + rightPredict == other.rightPredict + + case _ => false + } + + override def hashCode: Int = { + com.google.common.base.Objects.hashCode( + gain: java.lang.Float, + impurity: java.lang.Float, + leftImpurity: java.lang.Float, + rightImpurity: java.lang.Float, + leftPredict, + rightPredict) + } +} \ No newline at end of file diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala index 37bf4e733..261c7dd34 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala @@ -1,8 +1,8 @@ package com.tencent.angel.ml.tree.data import com.tencent.angel.ml.math2.vector.IntFloatVector -import com.tencent.angel.ml.tree.impurity.ImpurityCalculator -import com.tencent.angel.ml.tree.oldmodel.{ImpurityStats, InformationGainStats => OldInformationGainStats, Node => OldNode, Predict => OldPredict} +import com.tencent.angel.ml.tree.impurity.{ImpurityCalculator, ImpurityStats} +import com.tencent.angel.ml.tree.oldmodel.{Node => OldNode, Predict => OldPredict} /** * Decision tree node interface. @@ -174,7 +174,7 @@ class InternalNode private[ml] ( new OldNode(id, new OldPredict(prediction, prob = impurityStats.prob(prediction)), impurity, isLeaf = false, Some(split.toOld), Some(leftChild.toOld(OldNode.leftChildIndex(id))), Some(rightChild.toOld(OldNode.rightChildIndex(id))), - Some(new OldInformationGainStats(gain, impurity, leftChild.impurity, rightChild.impurity, + Some(new InfoGainStats(gain, impurity, leftChild.impurity, rightChild.impurity, new OldPredict(leftChild.prediction, prob = 0.0f), new OldPredict(rightChild.prediction, prob = 0.0f)))) } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/ImpurityStats.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/ImpurityStats.scala new file mode 100644 index 000000000..83584ebfa --- /dev/null +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/ImpurityStats.scala @@ -0,0 +1,61 @@ +package com.tencent.angel.ml.tree.impurity + +/** + * Impurity statistics for each split + * + * @param gain information gain value + * @param impurity current node impurity + * @param impurityCalculator impurity statistics for current node + * @param leftImpurityCalculator impurity statistics for left child node + * @param rightImpurityCalculator impurity statistics for right child node + * @param valid whether the current split satisfies minimum info gain or + * minimum number of instances per node + */ +private[tree] class ImpurityStats( + val gain: Float, + val impurity: Float, + val impurityCalculator: ImpurityCalculator, + val leftImpurityCalculator: ImpurityCalculator, + val rightImpurityCalculator: ImpurityCalculator, + val valid: Boolean = true) extends Serializable { + + override def toString: String = { + s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + + s"right impurity = $rightImpurity" + } + + def leftImpurity: Float = if (leftImpurityCalculator != null) { + leftImpurityCalculator.calculate() + } else { + -1.0f + } + + def rightImpurity: Float = if (rightImpurityCalculator != null) { + rightImpurityCalculator.calculate() + } else { + -1.0f + } +} + +private[tree] object ImpurityStats { + + /** + * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object to + * denote that current split doesn't satisfies minimum info gain or + * minimum number of instances per node. + */ + def getInvalidImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { + new ImpurityStats(Float.MinValue, impurityCalculator.calculate(), + impurityCalculator, null, null, false) + } + + /** + * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object + * that only 'impurity' and 'impurityCalculator' are defined. + */ + def getEmptyImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { + new ImpurityStats(Float.NaN, impurityCalculator.calculate(), impurityCalculator, null, null) + } +} + + diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala deleted file mode 100644 index 5cc62c65b..000000000 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/InformationGainStats.scala +++ /dev/null @@ -1,106 +0,0 @@ -package com.tencent.angel.ml.tree.oldmodel - -import com.tencent.angel.ml.tree.impurity.ImpurityCalculator - -/** - * Information gain statistics for each split - * @param gain information gain value - * @param impurity current node impurity - * @param leftImpurity left node impurity - * @param rightImpurity right node impurity - * @param leftPredict left node predict - * @param rightPredict right node predict - */ -class InformationGainStats( - val gain: Float, - val impurity: Float, - val leftImpurity: Float, - val rightImpurity: Float, - val leftPredict: Predict, - val rightPredict: Predict) extends Serializable { - - override def toString: String = { - s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + - s"right impurity = $rightImpurity" - } - - override def equals(o: Any): Boolean = o match { - case other: InformationGainStats => - gain == other.gain && - impurity == other.impurity && - leftImpurity == other.leftImpurity && - rightImpurity == other.rightImpurity && - leftPredict == other.leftPredict && - rightPredict == other.rightPredict - - case _ => false - } - - override def hashCode: Int = { - com.google.common.base.Objects.hashCode( - gain: java.lang.Float, - impurity: java.lang.Float, - leftImpurity: java.lang.Float, - rightImpurity: java.lang.Float, - leftPredict, - rightPredict) - } -} - -/** - * Impurity statistics for each split - * @param gain information gain value - * @param impurity current node impurity - * @param impurityCalculator impurity statistics for current node - * @param leftImpurityCalculator impurity statistics for left child node - * @param rightImpurityCalculator impurity statistics for right child node - * @param valid whether the current split satisfies minimum info gain or - * minimum number of instances per node - */ -private[tree] class ImpurityStats( - val gain: Float, - val impurity: Float, - val impurityCalculator: ImpurityCalculator, - val leftImpurityCalculator: ImpurityCalculator, - val rightImpurityCalculator: ImpurityCalculator, - val valid: Boolean = true) extends Serializable { - - override def toString: String = { - s"gain = $gain, impurity = $impurity, left impurity = $leftImpurity, " + - s"right impurity = $rightImpurity" - } - - def leftImpurity: Float = if (leftImpurityCalculator != null) { - leftImpurityCalculator.calculate() - } else { - -1.0f - } - - def rightImpurity: Float = if (rightImpurityCalculator != null) { - rightImpurityCalculator.calculate() - } else { - -1.0f - } -} - -private[tree] object ImpurityStats { - - /** - * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object to - * denote that current split doesn't satisfies minimum info gain or - * minimum number of instances per node. - */ - def getInvalidImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { - new ImpurityStats(Float.MinValue, impurityCalculator.calculate(), - impurityCalculator, null, null, false) - } - - /** - * Return an [[org.apache.spark.mllib.tree.model.ImpurityStats]] object - * that only 'impurity' and 'impurityCalculator' are defined. - */ - def getEmptyImpurityStats(impurityCalculator: ImpurityCalculator): ImpurityStats = { - new ImpurityStats(Float.NaN, impurityCalculator.calculate(), impurityCalculator, null, null) - } -} - diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala index 344a82708..5572f6b7e 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/oldmodel/Node.scala @@ -2,6 +2,7 @@ package com.tencent.angel.ml.tree.oldmodel import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.tree.conf.FeatureType._ +import com.tencent.angel.ml.tree.data.InfoGainStats /** * Node in a decision tree. @@ -27,7 +28,7 @@ class Node ( var split: Option[Split], var leftNode: Option[Node], var rightNode: Option[Node], - var stats: Option[InformationGainStats]) extends Serializable { + var stats: Option[InfoGainStats]) extends Serializable { override def toString: String = { s"id = $id, isLeaf = $isLeaf, predict = $predict, impurity = $impurity, " + From a236c34cb76971f65910b4344a3d9e3c8d46abe4 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 21 Nov 2018 17:27:48 +0800 Subject: [PATCH 013/115] chech tree num and assign trees --- .../tencent/angel/ml/tree/RandomForestLearner.scala | 13 +++++++++++-- .../tencent/angel/ml/tree/RandomForestRunner.scala | 11 +++++++++++ .../tencent/angel/ml/tree/model/RandomForest.scala | 9 ++++----- .../angel/ml/tree/model/RandomForestModel.scala | 8 +++++++- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index 454a4f3cd..49b368c5a 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -1,5 +1,6 @@ package com.tencent.angel.ml.tree +import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.MLLearner import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel @@ -45,7 +46,10 @@ class RandomForestLearner ( def this(ctx: TaskContext, strategy: Strategy) = this(ctx, strategy, seed = 0) def this(ctx: TaskContext) = this(ctx, Strategy.initStrategy(ctx.getConf)) - val model = null + private val totalNumTree = strategy.getNumTrees + private val localTreeIdx = assignTrees + + private val model = RandomForestModel(conf, ctx) def convertDataBlock(input: DataBlock[LabeledData]): Array[LabeledData] = { input.resetReadIndex() @@ -56,6 +60,9 @@ class RandomForestLearner ( ret.toArray } + def assignTrees: Array[Int] = + (0 until totalNumTree).filter(_/ctx.getTaskIndex == 0).toArray + /** * Method to train a decision tree model over an RDD * @@ -66,7 +73,9 @@ class RandomForestLearner ( def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { val trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) val validDataSet: Array[LabeledData] = convertDataBlock(validBlock) - val trees: Array[DecisionTreeModel] = RandomForest.train(ctx, trainDataSet, validDataSet, strategy, seed.toLong) + strategy.setNumTrees(localTreeIdx.length) + val trees: Array[DecisionTreeModel] = RandomForest.train(ctx, + trainDataSet, validDataSet, strategy, seed.toLong) new RandomForestModel(strategy.algo, trees, ctx.getConf, ctx) } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala index 3380b3e45..af31d335e 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestRunner.scala @@ -1,7 +1,9 @@ package com.tencent.angel.ml.tree import com.tencent.angel.client.AngelClientFactory +import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.MLRunner +import com.tencent.angel.ml.core.conf.MLConf import org.apache.commons.logging.LogFactory import org.apache.hadoop.conf.Configuration import com.tencent.angel.ml.tree.model.RandomForestModel @@ -12,6 +14,15 @@ class RandomForestRunner extends MLRunner { override def train(conf: Configuration): Unit = { + val numTasks = conf.getInt(AngelConf.ANGEL_WORKERGROUP_NUMBER, + AngelConf.DEFAULT_ANGEL_WORKERGROUP_NUMBER) * + conf.getInt(AngelConf.ANGEL_WORKER_TASK_NUMBER, AngelConf.DEFAULT_ANGEL_WORKER_TASK_NUMBER) + val numTrees = conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE) + if (numTrees < numTasks) { + conf.setInt(AngelConf.ANGEL_WORKERGROUP_NUMBER, numTrees) + conf.setInt(AngelConf.ANGEL_WORKER_TASK_NUMBER, 1) + } + val client = AngelClientFactory.get(conf) val model = RandomForestModel(conf) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala index 47234c0c1..d1500f605 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -5,10 +5,9 @@ import scala.util.Random import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.vector.IntFloatVector import com.tencent.angel.ml.tree.utils.{SamplingUtils, TimeTracker} -import com.tencent.angel.ml.tree.conf.{Algo => OldAlgo, Strategy => OldStrategy} +import com.tencent.angel.ml.tree.conf.{Algo, Strategy} import com.tencent.angel.ml.tree.data._ -import com.tencent.angel.ml.tree.impurity.ImpurityCalculator -import com.tencent.angel.ml.tree.oldmodel.ImpurityStats +import com.tencent.angel.ml.tree.impurity.{ImpurityCalculator, ImpurityStats} import com.tencent.angel.worker.task.TaskContext import org.apache.commons.logging.LogFactory @@ -68,7 +67,7 @@ private[tree] object RandomForest { ctx: TaskContext, trainData: Array[LabeledData], validData: Array[LabeledData], - strategy: OldStrategy, seed: Long, + strategy: Strategy, seed: Long, // exposed for testing only, real trees are always prune prune: Boolean = true): Array[DecisionTreeModel] = { @@ -178,7 +177,7 @@ private[tree] object RandomForest { val numFeatures = metadata.numFeatures - if (strategy.algo == OldAlgo.Classification) { + if (strategy.algo == Algo.Classification) { topNodes.map { rootNode => DecisionTreeClassificationModel(rootNode.toNode(prune), numFeatures, strategy.getNumClasses, ctx.getConf) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala index 4460e5e79..0eccb299a 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala @@ -9,11 +9,17 @@ import org.apache.hadoop.conf.Configuration object RandomForestModel { + val SPLIT_FEAT_MAT: String = "rf.split.feature" + val SPLIT_THRESHOLD_MAT: String = "rf.split.threshold" + val SPLIT_TYPE_MAT: String = "rf.split.type" + val NODE_PRED_MAT: String = "gbdt.node.predict" + + def apply(conf: Configuration): RandomForestModel = { RandomForestModel(conf, null) } - def apply(conf: Configuration, _ctx: TaskContext): RandomForestModel = { + def apply(conf: Configuration, _ctx: TaskContext): RandomForestModel = { val algo = conf.get(MLConf.ML_TREE_TASK_TYPE, MLConf.DEFAULT_ML_TREE_TASK_TYPE) val numTrees = conf.getInt(MLConf.ML_NUM_TREE, From 288684883db9732c4890810de0cf1b3eca7393c8 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 22 Nov 2018 11:46:58 +0800 Subject: [PATCH 014/115] error of task assignment --- .../src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala | 2 +- .../scala/com/tencent/angel/ml/tree/RandomForestLearner.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 88dffbabf..d610e2374 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -169,7 +169,7 @@ object MLConf { val ML_TREE_MAX_NUM_NODE = "ml.tree.max.node.num" val ML_TREE_MAX_BIN = "ml.tree.max.bin" val DEFAULT_ML_TREE_MAX_BIN = 3 - val ML_TREE_SUB_SAMPLE_RATE = "ml.tree.sub.sample.rae" + val ML_TREE_SUB_SAMPLE_RATE = "ml.tree.sub.sample.rate" val DEFAULT_ML_TREE_SUB_SAMPLE_RATE = 1 val ML_TREE_FEATURE_SAMPLE_STRATEGY = "ml.tree.feature.sample.strategy" val DEFAULT_ML_TREE_FEATURE_SAMPLE_STRATEGY = "all" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index 49b368c5a..fd5bc3af4 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -61,7 +61,7 @@ class RandomForestLearner ( } def assignTrees: Array[Int] = - (0 until totalNumTree).filter(_/ctx.getTaskIndex == 0).toArray + (0 until totalNumTree).filter(_%ctx.getTotalTaskNum == ctx.getTaskIndex).toArray /** * Method to train a decision tree model over an RDD From 30929f279cb3ae79d351d702eda5fa9e2e0dd528 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 23 Nov 2018 16:51:18 +0800 Subject: [PATCH 015/115] bug fix of config parser --- .../tencent/angel/ml/core/conf/MLConf.scala | 4 ++- .../core/utils/paramsutils/ParamParser.scala | 17 +++++++--- .../tencent/angel/ml/tree/conf/Strategy.scala | 33 ++++++++++--------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index d610e2374..4f48f99b6 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -33,7 +33,7 @@ object MLConf { val ML_DATA_INPUT_FORMAT = "ml.data.type" val DEFAULT_ML_DATA_INPUT_FORMAT = "libsvm" val ML_DATA_SPLITOR = "ml.data.splitor" - val DEFAULT_ML_DATA_SPLITOR = " " + val DEFAULT_ML_DATA_SPLITOR = "\\s+" val ML_DATA_IS_NEGY = "ml.data.is.negy" val DEFAULT_ML_DATA_IS_NEGY = true val ML_DATA_HAS_LABEL = "ml.data.has.label" @@ -195,6 +195,8 @@ object MLConf { val DEFAULT_ML_TREE_CATEGORICAL_FEATURE = "" val ML_TREE_IMPURITY = "ml.tree.impurity" val DEFAULT_ML_TREE_IMPURITY = "gini" + val ML_TREE_AGGRE_MAX_MEMORY_MB = "ml.tree.aggr.max.memory.mb" + val DEFAULT_ML_TREE_AGGRE_MAX_MEMORY_MB = 256 /** The loss sum of all samples */ val TRAIN_LOSS = "train.loss" diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala index 6f38a59df..76a15ce99 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/utils/paramsutils/ParamParser.scala @@ -22,11 +22,18 @@ object ParamParser { def parseMap(line: String, separator1: String = ",", separator2: String = ":"): Map[String, String] = { - line.trim - .split(separator1) - .map(_.split(separator2)) - .map{ case Array(k, v) => (k, v) } - .toMap + if (line.isEmpty) + return Map[String, String]() + else + line.trim + .split(separator1) + .map(_.split(separator2)) + .map{ case Array(k, v) => (k, v) } + .toMap } + def main(args: Array[String]): Unit = { + val line = "" + println(parseMap(line)) + } } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala index a17573663..9d6602cda 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/conf/Strategy.scala @@ -18,8 +18,6 @@ package com.tencent.angel.ml.tree.conf -import java.util.Locale - import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.ml.core.utils.paramsutils.ParamParser @@ -27,8 +25,7 @@ import scala.beans.BeanProperty import scala.collection.JavaConverters._ import com.tencent.angel.ml.tree.conf.Algo._ import com.tencent.angel.ml.tree.conf.QuantileStrategy._ -import com.tencent.angel.ml.tree.data.TreeEnsembleParams -import com.tencent.angel.ml.tree.impurity._ +import com.tencent.angel.ml.tree.impurity.{Impurity, Entropy, Gini, Variance} import org.apache.hadoop.conf.Configuration import scala.util.Try @@ -77,7 +74,7 @@ import scala.util.Try * E.g. 10 means that the cache will get checkpointed every 10 update. */ class Strategy (@BeanProperty var algo: Algo, - @BeanProperty var impurity: Impurity, + @BeanProperty var impurity: Impurity, @BeanProperty var numTrees: Int = 1, @BeanProperty var maxDepth: Int = 2, @BeanProperty var numClasses: Int = 2, @@ -88,9 +85,9 @@ class Strategy (@BeanProperty var algo: Algo, @BeanProperty var categoricalFeatures: Map[Int, Int] = Map[Int, Int](), @BeanProperty var minInstancesPerNode: Int = 1, @BeanProperty var minInfoGain: Double = 0.0, - var maxMemoryInMB: Int = 256, - var useNodeIdCache: Boolean = false, - var checkpointInterval: Int = 10) extends Serializable { + @BeanProperty var maxMemoryInMB: Int = 256, + @BeanProperty var useNodeIdCache: Boolean = false, + @BeanProperty var checkpointInterval: Int = 10) extends Serializable { def isMulticlassClassification: Boolean = { algo == Classification && numClasses > 2 @@ -123,10 +120,10 @@ class Strategy (@BeanProperty var algo: Algo, case _ => throw new IllegalArgumentException(s"Did not recognize Algo name: $algo") } - def setImpurity(impurity: String): Unit = impurity.toLowerCase match { - case "gini" => setImpurity(Gini) - case "entropy" => setImpurity(Entropy) - case "variance" => setImpurity(Variance) + def setImpurityWithString(impurity: String): Unit = impurity match { + case "Gini" | "gini" => setImpurity(Gini) + case "Entropy" | "entropy" => setImpurity(Entropy) + case "Variance" | "variance" => setImpurity(Variance) case _ => throw new IllegalArgumentException(s"Did not recognize Impurity name: $impurity") } @@ -139,8 +136,10 @@ class Strategy (@BeanProperty var algo: Algo, def setCategoricalFeatures(line: String): Unit = { val cateMap = ParamParser.parseMap(line) - .map{ case (k, v) => (k.toString.toInt, v.toString.toInt) } - this.categoricalFeatures = cateMap + if (cateMap.isEmpty) + this.categoricalFeatures = Map[Int, Int]() + else + this.categoricalFeatures = cateMap.map{ case (k, v) => (k.toString.toInt, v.toString.toInt) } } /** @@ -225,8 +224,8 @@ object Strategy { def initStrategy(conf: Configuration): Strategy = { val strategy = defaultStrategy(conf.get(MLConf.ML_TREE_TASK_TYPE, MLConf.DEFAULT_ML_TREE_TASK_TYPE).toLowerCase) - strategy.setImpurity(conf.get(MLConf.ML_TREE_IMPURITY, - MLConf.DEFAULT_ML_TREE_IMPURITY).toLowerCase) + strategy.setImpurityWithString(conf.get(MLConf.ML_TREE_IMPURITY, + MLConf.DEFAULT_ML_TREE_IMPURITY)) strategy.setNumTrees(conf.getInt(MLConf.ML_NUM_TREE, MLConf.DEFAULT_ML_NUM_TREE)) strategy.setMaxDepth(conf.getInt(MLConf.ML_TREE_MAX_DEPTH, @@ -245,6 +244,8 @@ object Strategy { MLConf.DEFAULT_ML_TREE_NODE_MIN_INSTANCE)) strategy.setMinInfoGain(conf.getDouble(MLConf.ML_TREE_NODE_MIN_INFOGAIN, MLConf.DEFAULT_ML_TREE_NODE_MIN_INFOGAIN)) + strategy.setMaxMemoryInMB(conf.getInt(MLConf.ML_TREE_AGGRE_MAX_MEMORY_MB, + MLConf.DEFAULT_ML_TREE_AGGRE_MAX_MEMORY_MB)) strategy.assertValid() strategy } From 6262f2a092e06468db77f8fb6413008152d4f743 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 23 Nov 2018 16:52:45 +0800 Subject: [PATCH 016/115] bug fix, rm log --- .../angel/ml/tree/RandomForestLearner.scala | 6 ++- .../ml/tree/data/DTStatsAggregator.scala | 2 + .../com/tencent/angel/ml/tree/data/Node.scala | 3 +- .../angel/ml/tree/impurity/Impurity.scala | 10 ++++ .../angel/ml/tree/model/RandomForest.scala | 47 ++++++++++++------- .../ml/tree/model/RandomForestModel.scala | 2 +- 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala index fd5bc3af4..d78aef176 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/RandomForestLearner.scala @@ -1,6 +1,5 @@ package com.tencent.angel.ml.tree -import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.MLLearner import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.model.MLModel @@ -13,6 +12,7 @@ import com.tencent.angel.ml.tree.conf.Strategy import com.tencent.angel.ml.tree.impurity.Impurities import com.tencent.angel.worker.storage.DataBlock import com.tencent.angel.worker.task.TaskContext +import org.apache.commons.logging.LogFactory import scala.collection.mutable.ArrayBuffer @@ -43,6 +43,8 @@ class RandomForestLearner ( val seed: Int) extends MLLearner(ctx) { + private val LOG = LogFactory.getLog(classOf[RandomForestLearner]) + def this(ctx: TaskContext, strategy: Strategy) = this(ctx, strategy, seed = 0) def this(ctx: TaskContext) = this(ctx, Strategy.initStrategy(ctx.getConf)) @@ -73,6 +75,8 @@ class RandomForestLearner ( def train(trainBlock: DataBlock[LabeledData], validBlock: DataBlock[LabeledData]): MLModel = { val trainDataSet: Array[LabeledData] = convertDataBlock(trainBlock) val validDataSet: Array[LabeledData] = convertDataBlock(validBlock) + LOG.info(s"Task[${ctx.getTaskIndex}] builds trees ${localTreeIdx.mkString(",")}") + LOG.info(s"Number of training: ${trainDataSet.length}, number of validation: ${validDataSet.length}") strategy.setNumTrees(localTreeIdx.length) val trees: Array[DecisionTreeModel] = RandomForest.train(ctx, trainDataSet, validDataSet, strategy, seed.toLong) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala index 72ed0a6a3..6e576659c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/DTStatsAggregator.scala @@ -57,6 +57,8 @@ private[tree] class DTStatsAggregator( */ private val allStats: Array[Float] = new Array[Float](allStatsSize) + private[tree] def getAllStats(): Array[Float] = allStats + /** * Array of parent node sufficient stats. * Note: parent stats need to be explicitly tracked in the [[DTStatsAggregator]] for unordered diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala index 261c7dd34..9b4139c7f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/data/Node.scala @@ -229,8 +229,7 @@ private object InternalNode { * - a leaf node, with leftChild, rightChild, split set to null, or * - an internal node, with all values set * - * @param id We currently use the same indexing as the old implementation in - * [[org.apache.spark.mllib.tree.model.Node]], but this will change later. + * @param id Integer node id, from 1 * @param isLeaf Indicates whether this node will definitely be a leaf in the learned tree, * so that we do not need to consider splitting it further. * @param stats Impurity statistics for this node. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala index fecc24244..e924fcba8 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/impurity/Impurity.scala @@ -2,6 +2,16 @@ package com.tencent.angel.ml.tree.impurity import java.util.Locale +object Impurity { + + def fromString(value: String): Impurity = value match { + case "Gini" | "gini" => Gini + case "Entropy" | "entropy" => Entropy + case "Variance" | "variance" => Variance + case _ => throw new IllegalArgumentException(s"Did not recognize Impurity name: $value") + } +} + /** * Trait for calculating information gain. * This trait is used for diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala index d1500f605..3249c2f2d 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForest.scala @@ -89,10 +89,10 @@ private[tree] object RandomForest { timer.start("findSplits") val splits = findSplits(trainData, metadata, seed) timer.stop("findSplits") - LOG.info("numBins: feature: number of bins") - LOG.info(Range(0, metadata.numFeatures).map { featureIndex => - s"\t$featureIndex\t${metadata.numBins(featureIndex)}" - }.mkString("\n")) +// LOG.info("numBins: feature: number of bins") +// LOG.info(Range(0, metadata.numFeatures).map { featureIndex => +// s"\t$featureIndex\t${metadata.numBins(featureIndex)}" +// }.mkString("\n")) // Bin feature values (TreePoint representation). // Cache input RDD for speedup during multiple passes. @@ -110,7 +110,6 @@ private[tree] object RandomForest { s"DecisionTree currently only supports maxDepth <= 30, but was given maxDepth = $maxDepth.") // Max memory usage for aggregates - // TODO: Calculate memory usage more precisely. val maxMemoryUsage: Long = strategy.maxMemoryInMB * 1024L * 1024L LOG.info("max memory usage for aggregates = " + maxMemoryUsage + " bytes.") @@ -366,6 +365,8 @@ private[tree] object RandomForest { val aggNodeIndex = nodeInfo.nodeIndexInGroup val featuresForNode = nodeInfo.featureSubset val instanceWeight = baggedPoint.subsampleWeights(treeIndex) + // Unordered features in categorical features + // Satisfy: 2 * ((1 << numCategories - 1) - 1) <= maxBins if (metadata.unorderedFeatures.isEmpty) { orderedBinSeqOp(agg(aggNodeIndex), baggedPoint.datum, instanceWeight, featuresForNode) } else { @@ -455,8 +456,10 @@ private[tree] object RandomForest { // Construct a nodeStatsAggregators array to hold node aggregate stats, // each node will have a nodeStatsAggregator val nodeStatsAggregators = Array.tabulate(numNodes) { nodeIndex => - val featuresForNode = nodeToFeatures.get.get(nodeIndex) - new DTStatsAggregator(metadata, featuresForNode) + nodeToFeatures match { + case Some(s) => new DTStatsAggregator(metadata, s.get(nodeIndex)) + case None => new DTStatsAggregator(metadata, None) + } } if (nodeIdCache.nonEmpty) { @@ -469,7 +472,11 @@ private[tree] object RandomForest { val nodeToBestSplits = nodeStatsAggregators.zipWithIndex.map { case (aggStats, nodeIndex) => - val featuresForNode = nodeToFeatures.get.get(nodeIndex) + //LOG.info(s"agg stats of node: node[$nodeIndex] ${aggStats.getAllStats().mkString(",")}") + val featuresForNode = nodeToFeatures match { + case Some(s) => s.get(nodeIndex) + case None => None + } // find best split for each node val (split: Split, stats: ImpurityStats) = binsToBestSplit(aggStats, splits, featuresForNode, nodes(nodeIndex)) @@ -492,14 +499,20 @@ private[tree] object RandomForest { val aggNodeIndex = nodeInfo.nodeIndexInGroup val (split: Split, stats: ImpurityStats) = nodeToBestSplits(aggNodeIndex) - LOG.info("best split = " + split) + LOG.info(s"best split: " + + s"tree[$treeIndex] " + + s"node[$nodeIndex] " + + s"feature[${split.toOld.feature}] " + + s"threshold[${split.toOld.threshold}] " + + s"type[${split.toOld.featureType}] " + + s"category[${split.toOld.categories.mkString(",")}]") // Extract info for this node. Create children if not leaf. val isLeaf = (stats.gain <= 0) || (LearningNode.indexToLevel(nodeIndex) == metadata.maxDepth) node.isLeaf = isLeaf node.stats = stats - LOG.info("Node = " + node) + LOG.info(s"Node: tree[$treeIndex] node[${node.id}]") if (!isLeaf) { node.split = Some(split) @@ -526,10 +539,12 @@ private[tree] object RandomForest { nodeStack.push((treeIndex, node.rightChild.get)) } - LOG.info("leftChildIndex = " + node.leftChild.get.id + - ", impurity = " + stats.leftImpurity) - LOG.info("rightChildIndex = " + node.rightChild.get.id + - ", impurity = " + stats.rightImpurity) + LOG.info(s"leftChild: tree[$treeIndex] " + + s"nodeIndex[${node.leftChild.get.id}] " + + s"impurity[${stats.leftImpurity}]") + LOG.info(s"rightChild: tree[$treeIndex] " + + s"nodeIndex[${node.rightChild.get.id}] " + + s"impurity[${stats.rightImpurity}]") } } } @@ -828,7 +843,7 @@ private[tree] object RandomForest { .map { case (idx, samples) => val thresholds = findSplitsForContinuousFeature(samples, metadata, idx) val splits: Array[Split] = thresholds.map(thresh => new ContinuousSplit(idx, thresh)) - LOG.info(s"featureIndex = $idx, numSplits = ${splits.length}") + //LOG.info(s"featureIndex = $idx, numSplits = ${splits.length}") (idx, splits) } } @@ -938,7 +953,7 @@ private[tree] object RandomForest { } else { // stride between splits val stride: Float = numSamples.toFloat / (numSplits + 1) - LOG.info("stride = " + stride) + //LOG.info("stride = " + stride) // iterate `valueCount` to find splits val splitsBuilder = mutable.ArrayBuilder.make[Float] diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala index 0eccb299a..5f5332162 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/RandomForestModel.scala @@ -52,5 +52,5 @@ class RandomForestModel ( extends TreeEnsembleModel(algo, trees, Array.fill(trees.length)(1.0), combiningStrategy = if (algo == Classification) Vote else Average, conf, _ctx) { - require(trees.forall(_.algo == algo)) + //require(trees.forall(_.algo == algo)) } From 2744e6224c14441f13f6b67a95f4cf2fba06c941 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 6 Dec 2018 13:35:57 +0800 Subject: [PATCH 017/115] reconstruct automl framework --- .../ml/automl/feature/FeatureCross.scala | 18 +++++++++++++++ .../ml/automl/feature/FeatureSelector.scala | 18 +++++++++++++++ .../ml/automl/feature/PreProcessing.scala | 17 ++++++++++++++ .../spark/ml/automl/tuner}/Example.scala | 22 ++----------------- .../tuner}/acquisition/Acquisition.scala | 2 +- .../ml/automl/tuner}/acquisition/EI.scala | 2 +- .../acquisition/optimizer/AcqOptimizer.scala | 2 +- .../acquisition/optimizer/LocalSearch.scala | 2 +- .../acquisition/optimizer/RandomSearch.scala | 2 +- .../automl/tuner}/config/Configuration.scala | 2 +- .../tuner}/config/ConfigurationSpace.scala | 2 +- .../tuner}/parameter/ContinuousSpace.scala | 2 +- .../tuner}/parameter/DiscreteSpace.scala | 2 +- .../automl/tuner}/parameter/ParamSpace.scala | 3 +-- .../ml/automl/tuner}/setting/Setting.scala | 2 +- .../ml/automl/tuner}/solver/Solver.scala | 2 +- .../tuner}/solver/SolverWithTrail.scala | 2 +- .../automl/tuner}/surrogate/RFSurrogate.scala | 3 ++- .../automl/tuner}/surrogate/Surrogate.scala | 2 +- .../ml/automl/tuner}/trail/TestRunner.scala | 2 +- .../ml/automl/tuner}/trail/TestTrail.scala | 3 ++- .../spark/ml/automl/tuner}/trail/Trail.scala | 2 +- .../ml/automl/tuner}/trail/TrailRunner.scala | 2 +- .../spark/ml/automl}/utils/DataUtils.scala | 2 +- .../spark/ml/automl}/utils/Distribution.scala | 2 +- 25 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/Example.scala (69%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/acquisition/Acquisition.scala (95%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/acquisition/EI.scala (97%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/acquisition/optimizer/AcqOptimizer.scala (95%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/acquisition/optimizer/LocalSearch.scala (96%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/acquisition/optimizer/RandomSearch.scala (96%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/config/Configuration.scala (96%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/config/ConfigurationSpace.scala (98%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/parameter/ContinuousSpace.scala (97%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/parameter/DiscreteSpace.scala (96%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/parameter/ParamSpace.scala (94%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/setting/Setting.scala (95%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/solver/Solver.scala (97%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/solver/SolverWithTrail.scala (96%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/surrogate/RFSurrogate.scala (97%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/surrogate/Surrogate.scala (98%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/trail/TestRunner.scala (94%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/trail/TestTrail.scala (95%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/trail/Trail.scala (94%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner}/trail/TrailRunner.scala (94%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl}/utils/DataUtils.scala (97%) rename {angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto => spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl}/utils/Distribution.scala (95%) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala new file mode 100644 index 000000000..4c74de541 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala @@ -0,0 +1,18 @@ +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class FeatureCross (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala new file mode 100644 index 000000000..7dec759ae --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala @@ -0,0 +1,18 @@ +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class FeatureSelector (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala new file mode 100644 index 000000000..c20abcc9b --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala @@ -0,0 +1,17 @@ +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class PreProcessing (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala similarity index 69% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala index b734fc3b5..0b7dc993d 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala @@ -1,22 +1,4 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.ml.auto +package com.tencent.angel.spark.ml.automl.tuner import com.tencent.angel.ml.auto.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.ml.auto.acquisition.{Acquisition, EI} @@ -52,4 +34,4 @@ object Example extends App { sur.stop() println(s"Best configuration ${result._1.getStorage.getValues.mkString(",")}, best performance: ${result._2}") } -} \ No newline at end of file +} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala index b6ab6e23b..3114e3c0c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.acquisition +package com.tencent.angel.spark.ml.automl.tuner.acquisition import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala similarity index 97% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala index ddfd4516d..e4cae1454 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.acquisition +package com.tencent.angel.spark.ml.automl.tuner.acquisition import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index 5d0f88fb6..590d3431c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.acquisition.optimizer +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration,ConfigurationSpace} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala index ef9349944..7fe88e3d3 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.acquisition.optimizer +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index e5bcc2571..4b3793d72 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.acquisition.optimizer +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala index 29425d613..efd4e4609 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.config +package com.tencent.angel.spark.ml.automl.tuner.config import com.tencent.angel.ml.math2.vector.IntFloatVector diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala similarity index 98% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index 862a37b57..ea39a4b1f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.config +package com.tencent.angel.spark.ml.automl.tuner.config import com.tencent.angel.ml.auto.parameter.ParamSpace import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala similarity index 97% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index 56bfe0320..0b39c6c93 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.parameter +package com.tencent.angel.spark.ml.automl.tuner.parameter import com.tencent.angel.ml.auto.utils.Distribution import org.apache.commons.logging.{Log, LogFactory} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala index 9f5bea824..c4296a459 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.parameter +package com.tencent.angel.spark.ml.automl.tuner.parameter import scala.util.Random diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala similarity index 94% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala index cd7184ec9..55ab25e40 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -16,8 +16,7 @@ */ -package com.tencent.angel.ml.auto.parameter - +package com.tencent.angel.spark.ml.automl.tuner.parameter /** * Base class of a single parameter's search space. diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala index 94f19f5ba..13de4d332 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.setting +package com.tencent.angel.spark.ml.automl.tuner.setting class Setting { } diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala similarity index 97% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 30ec39b6a..445b7f503 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.solver +package com.tencent.angel.spark.ml.automl.tuner.solver import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.acquisition.optimizer.AcqOptimizer diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala similarity index 96% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala index 7dba25cfc..b3d6f25b6 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.solver +package com.tencent.angel.spark.ml.automl.tuner.solver import com.tencent.angel.ml.auto.config.Configuration import com.tencent.angel.ml.auto.trail.Trail diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala similarity index 97% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 6dcc62eff..9127bf847 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -16,7 +16,8 @@ */ -package com.tencent.angel.ml.auto.surrogate +package com.tencent.angel.spark.ml.automl.tuner.surrogate + import com.tencent.angel.ml.auto.utils.DataUtils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala similarity index 98% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index f815c886a..95b77a46d 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.surrogate +package com.tencent.angel.spark.ml.automl.tuner.surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala similarity index 94% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala index 2aacf62f1..45f546eb4 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.trail +package com.tencent.angel.spark.ml.automl.tuner.trail import com.tencent.angel.ml.auto.config.Configuration diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala index 3cdf3701e..6256854b1 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala @@ -16,7 +16,8 @@ */ -package com.tencent.angel.ml.auto.trail +package com.tencent.angel.spark.ml.automl.tuner.trail + import com.tencent.angel.ml.auto.config.Configuration class TestTrail extends Trail { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala similarity index 94% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala index c00f24fc8..893cc8016 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.trail +package com.tencent.angel.spark.ml.automl.tuner.trail import com.tencent.angel.ml.auto.config.Configuration diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala similarity index 94% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala index 4a6deee94..bec0ce404 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.trail +package com.tencent.angel.spark.ml.automl.tuner.trail import java.util.concurrent.Callable diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala similarity index 97% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala index 9e1255db0..75d170f5f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.utils +package com.tencent.angel.spark.ml.automl.utils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.spark.mllib.linalg.{Vector, Vectors} diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala similarity index 95% rename from angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala index af0f61274..fda53d886 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.ml.auto.utils +package com.tencent.angel.spark.ml.automl.utils object Distribution extends Enumeration { From 78b34e64ca575ce778afb676947a8adc89c4188a Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 6 Dec 2018 21:55:37 +0800 Subject: [PATCH 018/115] import error --- .../angel/spark/ml/automl/tuner/Example.scala | 16 ++++++++-------- .../automl/tuner/acquisition/Acquisition.scala | 2 +- .../spark/ml/automl/tuner/acquisition/EI.scala | 2 +- .../acquisition/optimizer/AcqOptimizer.scala | 4 ++-- .../acquisition/optimizer/LocalSearch.scala | 4 ++-- .../acquisition/optimizer/RandomSearch.scala | 6 +++--- .../automl/tuner/config/ConfigurationSpace.scala | 2 +- .../automl/tuner/parameter/ContinuousSpace.scala | 3 +-- .../spark/ml/automl/tuner/solver/Solver.scala | 10 +++++----- .../ml/automl/tuner/solver/SolverWithTrail.scala | 4 ++-- .../ml/automl/tuner/surrogate/RFSurrogate.scala | 2 +- .../spark/ml/automl/tuner/trail/TestRunner.scala | 2 +- .../spark/ml/automl/tuner/trail/TestTrail.scala | 2 +- .../spark/ml/automl/tuner/trail/Trail.scala | 2 +- .../ml/automl/tuner/trail/TrailRunner.scala | 2 +- 15 files changed, 31 insertions(+), 32 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala index 0b7dc993d..00ad171b8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala @@ -1,13 +1,13 @@ package com.tencent.angel.spark.ml.automl.tuner -import com.tencent.angel.ml.auto.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.ml.auto.acquisition.{Acquisition, EI} -import com.tencent.angel.ml.auto.config.ConfigurationSpace -import com.tencent.angel.ml.auto.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.ml.auto.setting.Setting -import com.tencent.angel.ml.auto.solver.{Solver, SolverWithTrail} -import com.tencent.angel.ml.auto.surrogate.{RFSurrogate, Surrogate} -import com.tencent.angel.ml.auto.trail.{TestTrail, Trail} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.ml.automl.tuner.setting.Setting +import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} import com.tencent.angel.ml.math2.vector.IntFloatVector object Example extends App { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala index 3114e3c0c..fb386b122 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition -import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector /** diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala index e4cae1454..1388c12a8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition -import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index 590d3431c..7599314ef 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.ml.auto.acquisition.Acquisition -import com.tencent.angel.ml.auto.config.{Configuration,ConfigurationSpace} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration,ConfigurationSpace} /** * Abstract base class for acquisition maximization. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala index 7fe88e3d3..5e3aff1d5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.ml.auto.acquisition.Acquisition -import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} /** * Implementation of local search. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index 4b3793d72..dffa9427b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -18,9 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.ml.auto.acquisition.Acquisition -import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.ml.auto.setting.Setting +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.ml.automl.tuner.setting.Setting import org.apache.commons.logging.{Log, LogFactory} import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index ea39a4b1f..359adfcf3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.config -import com.tencent.angel.ml.auto.parameter.ParamSpace +import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index 0b39c6c93..679e16a32 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -18,8 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter -import com.tencent.angel.ml.auto.utils.Distribution -import org.apache.commons.logging.{Log, LogFactory} +import com.tencent.angel.spark.ml.automl.utils.Distribution import scala.collection.mutable.ListBuffer import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 445b7f503..ff5d273ae 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -18,11 +18,11 @@ package com.tencent.angel.spark.ml.automl.tuner.solver -import com.tencent.angel.ml.auto.acquisition.Acquisition -import com.tencent.angel.ml.auto.acquisition.optimizer.AcqOptimizer -import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.ml.auto.setting.Setting -import com.tencent.angel.ml.auto.surrogate.Surrogate +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.AcqOptimizer +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.ml.automl.tuner.setting.Setting +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala index b3d6f25b6..408a617a6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.solver -import com.tencent.angel.ml.auto.config.Configuration -import com.tencent.angel.ml.auto.trail.Trail +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.trail.Trail import com.tencent.angel.ml.math2.vector.IntFloatVector class SolverWithTrail(val solver: Solver, val trail: Trail) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 9127bf847..2d81cf1f8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.surrogate -import com.tencent.angel.ml.auto.utils.DataUtils +import com.tencent.angel.spark.ml.automl.utils.DataUtils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.mllib.tree.GradientBoostedTrees diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala index 45f546eb4..4f35b3881 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration class TestRunner(config: Configuration) extends TrailRunner(config) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala index 6256854b1..14ffb984f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration class TestTrail extends Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala index 893cc8016..c853231c0 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration abstract class Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala index bec0ce404..b891c5de9 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala @@ -20,7 +20,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail import java.util.concurrent.Callable -import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration abstract class TrailRunner(var config: Configuration) extends Callable[Float]{ From 948b35182e09253868c0eb7fadd777b33ff85fd4 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 6 Dec 2018 22:29:15 +0800 Subject: [PATCH 019/115] Revert "import error" This reverts commit 78b34e64ca575ce778afb676947a8adc89c4188a. --- .../angel/spark/ml/automl/tuner/Example.scala | 16 ++++++++-------- .../automl/tuner/acquisition/Acquisition.scala | 2 +- .../spark/ml/automl/tuner/acquisition/EI.scala | 2 +- .../acquisition/optimizer/AcqOptimizer.scala | 4 ++-- .../acquisition/optimizer/LocalSearch.scala | 4 ++-- .../acquisition/optimizer/RandomSearch.scala | 6 +++--- .../automl/tuner/config/ConfigurationSpace.scala | 2 +- .../automl/tuner/parameter/ContinuousSpace.scala | 3 ++- .../spark/ml/automl/tuner/solver/Solver.scala | 10 +++++----- .../ml/automl/tuner/solver/SolverWithTrail.scala | 4 ++-- .../ml/automl/tuner/surrogate/RFSurrogate.scala | 2 +- .../spark/ml/automl/tuner/trail/TestRunner.scala | 2 +- .../spark/ml/automl/tuner/trail/TestTrail.scala | 2 +- .../spark/ml/automl/tuner/trail/Trail.scala | 2 +- .../ml/automl/tuner/trail/TrailRunner.scala | 2 +- 15 files changed, 32 insertions(+), 31 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala index 00ad171b8..0b7dc993d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala @@ -1,13 +1,13 @@ package com.tencent.angel.spark.ml.automl.tuner -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace -import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.ml.automl.tuner.setting.Setting -import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.{RFSurrogate, Surrogate} -import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} +import com.tencent.angel.ml.auto.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.ml.auto.acquisition.{Acquisition, EI} +import com.tencent.angel.ml.auto.config.ConfigurationSpace +import com.tencent.angel.ml.auto.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.ml.auto.setting.Setting +import com.tencent.angel.ml.auto.solver.{Solver, SolverWithTrail} +import com.tencent.angel.ml.auto.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.ml.auto.trail.{TestTrail, Trail} import com.tencent.angel.ml.math2.vector.IntFloatVector object Example extends App { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala index fb386b122..3114e3c0c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector /** diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala index 1388c12a8..e4cae1454 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index 7599314ef..590d3431c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration,ConfigurationSpace} +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration,ConfigurationSpace} /** * Abstract base class for acquisition maximization. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala index 5e3aff1d5..7fe88e3d3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} /** * Implementation of local search. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index dffa9427b..4b3793d72 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -18,9 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.setting.Setting +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.ml.auto.setting.Setting import org.apache.commons.logging.{Log, LogFactory} import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index 359adfcf3..ea39a4b1f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.config -import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace +import com.tencent.angel.ml.auto.parameter.ParamSpace import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index 679e16a32..0b39c6c93 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -18,7 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter -import com.tencent.angel.spark.ml.automl.utils.Distribution +import com.tencent.angel.ml.auto.utils.Distribution +import org.apache.commons.logging.{Log, LogFactory} import scala.collection.mutable.ListBuffer import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index ff5d273ae..445b7f503 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -18,11 +18,11 @@ package com.tencent.angel.spark.ml.automl.tuner.solver -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.AcqOptimizer -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.setting.Setting -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import com.tencent.angel.ml.auto.acquisition.Acquisition +import com.tencent.angel.ml.auto.acquisition.optimizer.AcqOptimizer +import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.ml.auto.setting.Setting +import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala index 408a617a6..b3d6f25b6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.solver -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration -import com.tencent.angel.spark.ml.automl.tuner.trail.Trail +import com.tencent.angel.ml.auto.config.Configuration +import com.tencent.angel.ml.auto.trail.Trail import com.tencent.angel.ml.math2.vector.IntFloatVector class SolverWithTrail(val solver: Solver, val trail: Trail) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 2d81cf1f8..9127bf847 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.surrogate -import com.tencent.angel.spark.ml.automl.utils.DataUtils +import com.tencent.angel.ml.auto.utils.DataUtils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.mllib.tree.GradientBoostedTrees diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala index 4f35b3881..45f546eb4 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.ml.auto.config.Configuration class TestRunner(config: Configuration) extends TrailRunner(config) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala index 14ffb984f..6256854b1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.ml.auto.config.Configuration class TestTrail extends Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala index c853231c0..893cc8016 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.ml.auto.config.Configuration abstract class Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala index b891c5de9..bec0ce404 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala @@ -20,7 +20,7 @@ package com.tencent.angel.spark.ml.automl.tuner.trail import java.util.concurrent.Callable -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.ml.auto.config.Configuration abstract class TrailRunner(var config: Configuration) extends Callable[Float]{ From 2115a896e439ef2e49aa3411227ddf7f77ff05e2 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 6 Dec 2018 22:29:19 +0800 Subject: [PATCH 020/115] Revert "reconstruct automl framework" This reverts commit 2744e6224c14441f13f6b67a95f4cf2fba06c941. --- .../com/tencent/angel/ml/auto}/Example.scala | 22 +++++++++++++++++-- .../ml/auto}/acquisition/Acquisition.scala | 2 +- .../angel/ml/auto}/acquisition/EI.scala | 2 +- .../acquisition/optimizer/AcqOptimizer.scala | 2 +- .../acquisition/optimizer/LocalSearch.scala | 2 +- .../acquisition/optimizer/RandomSearch.scala | 2 +- .../angel/ml/auto}/config/Configuration.scala | 2 +- .../ml/auto}/config/ConfigurationSpace.scala | 2 +- .../ml/auto}/parameter/ContinuousSpace.scala | 2 +- .../ml/auto}/parameter/DiscreteSpace.scala | 2 +- .../angel/ml/auto}/parameter/ParamSpace.scala | 3 ++- .../angel/ml/auto}/setting/Setting.scala | 2 +- .../angel/ml/auto}/solver/Solver.scala | 2 +- .../ml/auto}/solver/SolverWithTrail.scala | 2 +- .../ml/auto}/surrogate/RFSurrogate.scala | 3 +-- .../angel/ml/auto}/surrogate/Surrogate.scala | 2 +- .../angel/ml/auto}/trail/TestRunner.scala | 2 +- .../angel/ml/auto}/trail/TestTrail.scala | 3 +-- .../tencent/angel/ml/auto}/trail/Trail.scala | 2 +- .../angel/ml/auto}/trail/TrailRunner.scala | 2 +- .../angel/ml/auto}/utils/DataUtils.scala | 2 +- .../angel/ml/auto}/utils/Distribution.scala | 2 +- .../ml/automl/feature/FeatureCross.scala | 18 --------------- .../ml/automl/feature/FeatureSelector.scala | 18 --------------- .../ml/automl/feature/PreProcessing.scala | 17 -------------- 25 files changed, 42 insertions(+), 78 deletions(-) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/Example.scala (69%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/acquisition/Acquisition.scala (95%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/acquisition/EI.scala (97%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/acquisition/optimizer/AcqOptimizer.scala (95%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/acquisition/optimizer/LocalSearch.scala (96%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/acquisition/optimizer/RandomSearch.scala (96%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/config/Configuration.scala (96%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/config/ConfigurationSpace.scala (98%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/parameter/ContinuousSpace.scala (97%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/parameter/DiscreteSpace.scala (96%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/parameter/ParamSpace.scala (94%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/setting/Setting.scala (95%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/solver/Solver.scala (97%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/solver/SolverWithTrail.scala (96%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/surrogate/RFSurrogate.scala (97%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/surrogate/Surrogate.scala (98%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/trail/TestRunner.scala (94%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/trail/TestTrail.scala (95%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/trail/Trail.scala (94%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/trail/TrailRunner.scala (94%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/utils/DataUtils.scala (97%) rename {spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl => angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto}/utils/Distribution.scala (95%) delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala similarity index 69% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala index 0b7dc993d..b734fc3b5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/Example.scala @@ -1,4 +1,22 @@ -package com.tencent.angel.spark.ml.automl.tuner +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.ml.auto import com.tencent.angel.ml.auto.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.ml.auto.acquisition.{Acquisition, EI} @@ -34,4 +52,4 @@ object Example extends App { sur.stop() println(s"Best configuration ${result._1.getStorage.getValues.mkString(",")}, best performance: ${result._2}") } -} +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala index 3114e3c0c..b6ab6e23b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/Acquisition.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition +package com.tencent.angel.ml.auto.acquisition import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala index e4cae1454..ddfd4516d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/EI.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition +package com.tencent.angel.ml.auto.acquisition import com.tencent.angel.ml.auto.surrogate.Surrogate import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala index 590d3431c..5d0f88fb6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/AcqOptimizer.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.ml.auto.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration,ConfigurationSpace} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala index 7fe88e3d3..ef9349944 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/LocalSearch.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.ml.auto.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala index 4b3793d72..e5bcc2571 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/acquisition/optimizer/RandomSearch.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.ml.auto.acquisition.optimizer import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.config.{Configuration, ConfigurationSpace} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala index efd4e4609..29425d613 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/Configuration.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.config +package com.tencent.angel.ml.auto.config import com.tencent.angel.ml.math2.vector.IntFloatVector diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala similarity index 98% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala index ea39a4b1f..862a37b57 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/config/ConfigurationSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.config +package com.tencent.angel.ml.auto.config import com.tencent.angel.ml.auto.parameter.ParamSpace import com.tencent.angel.ml.math2.storage.IntFloatDenseVectorStorage diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala index 0b39c6c93..56bfe0320 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ContinuousSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.ml.auto.parameter import com.tencent.angel.ml.auto.utils.Distribution import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala index c4296a459..9f5bea824 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/DiscreteSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.ml.auto.parameter import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala index 55ab25e40..cd7184ec9 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/parameter/ParamSpace.scala @@ -16,7 +16,8 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.ml.auto.parameter + /** * Base class of a single parameter's search space. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala index 13de4d332..94f19f5ba 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/setting/Setting.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/setting/Setting.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.setting +package com.tencent.angel.ml.auto.setting class Setting { } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala index 445b7f503..30ec39b6a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/Solver.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.solver +package com.tencent.angel.ml.auto.solver import com.tencent.angel.ml.auto.acquisition.Acquisition import com.tencent.angel.ml.auto.acquisition.optimizer.AcqOptimizer diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala index b3d6f25b6..7dba25cfc 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/solver/SolverWithTrail.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.solver +package com.tencent.angel.ml.auto.solver import com.tencent.angel.ml.auto.config.Configuration import com.tencent.angel.ml.auto.trail.Trail diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala index 9127bf847..6dcc62eff 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/RFSurrogate.scala @@ -16,8 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.surrogate - +package com.tencent.angel.ml.auto.surrogate import com.tencent.angel.ml.auto.utils.DataUtils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala similarity index 98% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala index 95b77a46d..f815c886a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/surrogate/Surrogate.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.surrogate +package com.tencent.angel.ml.auto.surrogate import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala index 45f546eb4..2aacf62f1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestRunner.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.ml.auto.trail import com.tencent.angel.ml.auto.config.Configuration diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala index 6256854b1..3cdf3701e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TestTrail.scala @@ -16,8 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail - +package com.tencent.angel.ml.auto.trail import com.tencent.angel.ml.auto.config.Configuration class TestTrail extends Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala index 893cc8016..c00f24fc8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/Trail.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.ml.auto.trail import com.tencent.angel.ml.auto.config.Configuration diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala index bec0ce404..4a6deee94 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/trail/TrailRunner.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.ml.auto.trail import java.util.concurrent.Callable diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala index 75d170f5f..9e1255db0 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/DataUtils.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.utils +package com.tencent.angel.ml.auto.utils import com.tencent.angel.ml.math2.vector.IntFloatVector import org.apache.spark.mllib.linalg.{Vector, Vectors} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala rename to angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala index fda53d886..af0f61274 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/auto/utils/Distribution.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.utils +package com.tencent.angel.ml.auto.utils object Distribution extends Enumeration { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala deleted file mode 100644 index 4c74de541..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature - -import org.apache.spark.ml.Transformer -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.DefaultParamsWritable -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.StructType - -class FeatureCross (override val uid: String) - extends Transformer with DefaultParamsWritable { - - override def transform(dataset: Dataset[_]): DataFrame = ??? - - override def copy(extra: ParamMap): Transformer = ??? - - override def transformSchema(schema: StructType): StructType = ??? - -} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala deleted file mode 100644 index 7dec759ae..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature - -import org.apache.spark.ml.Transformer -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.DefaultParamsWritable -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.StructType - -class FeatureSelector (override val uid: String) - extends Transformer with DefaultParamsWritable { - - override def transform(dataset: Dataset[_]): DataFrame = ??? - - override def copy(extra: ParamMap): Transformer = ??? - - override def transformSchema(schema: StructType): StructType = ??? - -} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala deleted file mode 100644 index c20abcc9b..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala +++ /dev/null @@ -1,17 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature - -import org.apache.spark.ml.Transformer -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.DefaultParamsWritable -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.StructType - -class PreProcessing (override val uid: String) - extends Transformer with DefaultParamsWritable { - - override def transform(dataset: Dataset[_]): DataFrame = ??? - - override def copy(extra: ParamMap): Transformer = ??? - - override def transformSchema(schema: StructType): StructType = ??? -} From 4ce98613c5a9010abcbb4bf1840e2be6402bbeeb Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 7 Dec 2018 15:30:18 +0800 Subject: [PATCH 021/115] reconstruct to spark.ml API --- .../ml/automl/feature/FeatureCross.scala | 36 +++++ .../ml/automl/feature/FeatureSelector.scala | 36 +++++ .../ml/automl/feature/PreProcessing.scala | 35 +++++ .../angel/spark/ml/automl/tuner/Example.scala | 54 +++++++ .../spark/ml/automl/tuner/TunerParam.scala | 42 ++++++ .../tuner/acquisition/Acquisition.scala | 38 +++++ .../ml/automl/tuner/acquisition/EI.scala | 62 ++++++++ .../acquisition/optimizer/AcqOptimizer.scala | 42 ++++++ .../acquisition/optimizer/LocalSearch.scala | 49 +++++++ .../acquisition/optimizer/RandomSearch.scala | 57 ++++++++ .../automl/tuner/config/Configuration.scala | 44 ++++++ .../tuner/config/ConfigurationSpace.scala | 96 +++++++++++++ .../tuner/parameter/ContinuousSpace.scala | 86 +++++++++++ .../tuner/parameter/DiscreteSpace.scala | 58 ++++++++ .../automl/tuner/parameter/ParamSpace.scala | 32 +++++ .../spark/ml/automl/tuner/solver/Solver.scala | 62 ++++++++ .../automl/tuner/solver/SolverWithTrail.scala | 46 ++++++ .../automl/tuner/surrogate/RFSurrogate.scala | 96 +++++++++++++ .../ml/automl/tuner/surrogate/Surrogate.scala | 134 ++++++++++++++++++ .../ml/automl/tuner/trail/TestRunner.scala | 35 +++++ .../ml/automl/tuner/trail/TestTrail.scala | 35 +++++ .../spark/ml/automl/tuner/trail/Trail.scala | 29 ++++ .../ml/automl/tuner/trail/TrailRunner.scala | 32 +++++ .../spark/ml/automl/utils/DataUtils.scala | 44 ++++++ .../spark/ml/automl/utils/Distribution.scala | 30 ++++ 25 files changed, 1310 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala new file mode 100644 index 000000000..29ba3da54 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala @@ -0,0 +1,36 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class FeatureCross (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? + +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala new file mode 100644 index 000000000..7e92d785b --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala @@ -0,0 +1,36 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class FeatureSelector (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala new file mode 100644 index 000000000..ddd674cc2 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala @@ -0,0 +1,35 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.DefaultParamsWritable +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType + +class PreProcessing (override val uid: String) + extends Transformer with DefaultParamsWritable { + + override def transform(dataset: Dataset[_]): DataFrame = ??? + + override def copy(extra: ParamMap): Transformer = ??? + + override def transformSchema(schema: StructType): StructType = ??? +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala new file mode 100644 index 000000000..490719893 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala @@ -0,0 +1,54 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner + +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector + +object Example extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", List(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", List(-5.0, -3.0, 0.0, 3.0, 5.0)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + TunerParam.setBatchSize(1) + TunerParam.setSampleSize(100) + val sur: Surrogate = new RFSurrogate(cs, true) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + val solver: Solver = new Solver(cs, sur, acq, opt) + val trail: Trail = new TestTrail() + val runner: SolverWithTrail = new SolverWithTrail(solver, trail) + val result: (Vector, Double) = runner.run(10) + sur.stop() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala new file mode 100644 index 000000000..feb8f97cd --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner + +class TunerParam { +} + +object TunerParam { + + var batchSize: Int = 1 + var sampleSize: Int = 10 * batchSize + + var taskName: String = "com.tencent.angel.spark.ml.automl.tuner.trail.TestRunner" + + def setBatchSize(num: Int): Unit = { + batchSize = num + } + + def setSampleSize(num: Int): Unit = { + sampleSize = num + } + + def setTaskName(name: String): Unit = { + taskName = name + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala new file mode 100644 index 000000000..413fdb0bc --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala @@ -0,0 +1,38 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.acquisition + +import org.apache.spark.ml.linalg.Vector +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate + + +/** + * Abstract base class for acquisition function + */ +abstract class Acquisition(val surrogate: Surrogate) { + + /** + * Computes the acquisition value for a given point X + * + * @param X : (1, D), the input points where the acquisition function should be evaluated. + * @return (1, 1) Expected Improvement of X, (1, D) Derivative of Expected Improvement at X + */ + def compute(X: Vector, derivative: Boolean = false): (Double, Vector) + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala new file mode 100644 index 000000000..f11a3ea1d --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala @@ -0,0 +1,62 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.acquisition + +import org.apache.spark.ml.linalg.{Vector, Vectors} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.commons.math3.distribution.NormalDistribution + +/** + * Expected improvement. + * @param surrogate + * @param par : Controls the balance between exploration and exploitation of the acquisition function, default=0.0 + * + */ +class EI( + override val surrogate: Surrogate, + val par: Double) + extends Acquisition(surrogate) { + + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + override def compute(X: Vector, derivative: Boolean = false): (Double, Vector) = { + val pred = surrogate.predict(X) // (mean, variance) + + // Use the best seen observation as incumbent + val eta: Double = surrogate.curBest._2 + //println(s"best seen result: $eta") + + val s: Double = Math.sqrt(pred._2).toFloat + + if (s == 0) { + // if std is zero, we have observed x on all instances + // using a RF, std should be never exactly 0.0 + (0.0, Vectors.dense(new Array[Double](X.size))) + } else { + val z = (eta - pred._1 - par) / s + val norm: NormalDistribution = new NormalDistribution + val cdf: Double = norm.cumulativeProbability(z) + val pdf: Double = norm.density(z) + val f = s * (z * cdf + pdf) + println(s"cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf, f: $f") + (f, Vectors.dense(new Array[Double](X.size))) + } + } +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala new file mode 100644 index 000000000..d3aa365ba --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer + +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration,ConfigurationSpace} + +/** + * Abstract base class for acquisition maximization. + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + */ +abstract class AcqOptimizer( + val acqFunc: Acquisition, + val configSpace: ConfigurationSpace) { + + /** + * Maximizes the given acquisition function. + * + * @param numPoints : Number of queried points. + * @return A set of tuple(acquisition value, Configuration). + */ + def maximize(numPoints: Int, sorted: Boolean = true): List[(Double, Configuration)] + + def maximize: (Double, Configuration) +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala new file mode 100644 index 000000000..7bf2fe956 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -0,0 +1,49 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer + +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} + +/** + * Implementation of local search. + * + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + * @param epsilon : In order to perform a local move one of the incumbent's neighbors needs at least an improvement higher than epsilon + * @param numIters : Maximum number of iterations that the local search will perform + */ +class LocalSearch( + override val acqFunc: Acquisition, + override val configSpace: ConfigurationSpace, + epsilon: String, numIters: Int) + extends AcqOptimizer(acqFunc, configSpace) { + + /** + * Starts a local search from the given start point and quits if either the max number of steps is reached or + * no neighbor with an higher improvement was found + * + * @param numPoints : Number of queried points. + * @return A set of tuple(acquisition_value, Configuration). + */ + override def maximize(numPoints: Int, + sorted: Boolean = true): List[(Double, Configuration)] = ??? + + override def maximize: (Double, Configuration) = ??? +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala new file mode 100644 index 000000000..1fd822841 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -0,0 +1,57 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer + +import com.tencent.angel.spark.ml.automl.tuner.TunerParam +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import org.apache.commons.logging.{Log, LogFactory} + +import scala.util.Random + +/** + * Get candidate solutions via random sampling of configurations. + * + * @param acqFunc : The acquisition function which will be maximized + * @param configSpace : Configuration space of parameters + * @param seed + */ +class RandomSearch( + override val acqFunc: Acquisition, + override val configSpace: ConfigurationSpace, + seed: Int = 100) extends AcqOptimizer(acqFunc, configSpace) { + + val LOG: Log = LogFactory.getLog(classOf[RandomSearch]) + + val rd = new Random(seed) + + override def maximize(numPoints: Int, sorted: Boolean = true): List[(Double, Configuration)] = { + //println(s"maximize RandomSearch") + val configs: List[Configuration] = configSpace.sampleConfig(TunerParam.sampleSize) + configs.foreach( config => println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}")) + if (sorted) + configs.map{config => (acqFunc.compute(config.getVector)._1, config)}.sortWith(_._1 > _._1).take(numPoints) + else + rd.shuffle(configs.map{config => (0.0, config)}).take(numPoints) + } + + override def maximize: (Double, Configuration) = { + maximize(1, true).head + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala new file mode 100644 index 000000000..9df69dadc --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.config + +import org.apache.spark.ml.linalg.Vector + +/** + * A single configuration + * + * @param configSpace : The configuration space for this configuration + * @param vector : A vector for efficient representation of configuration. + */ +class Configuration( + configSpace: ConfigurationSpace, + vector: Vector) { + + def getVector: Vector = vector + + def getValues: Array[Double] = vector.toArray + + def keys: List[String] = configSpace.param2Idx.keys.toList + + def get(name: String): Double = get(configSpace.param2Idx.getOrElse(name, -1)) + + def get(idx: Int): Double = vector(idx) + + def contains(name: String): Boolean = configSpace.param2Idx.contains(name) +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala new file mode 100644 index 000000000..8620180f1 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -0,0 +1,96 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.config + +import org.apache.spark.ml.linalg.{Vector, VectorUDT, Vectors} +import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.sql.types._ + +import scala.collection.mutable.{ArrayBuffer, ListBuffer} + +class ConfigurationSpace( + val name: String, + var paramDict: Map[String, ParamSpace[Double]] = Map()) { + + val LOG: Log = LogFactory.getLog(classOf[ConfigurationSpace]) + + var numParams: Int = paramDict.size + + var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() + + var param2Idx: Map[String, Int] = paramDict.keys.zipWithIndex.toMap + var idx2Param: Map[Int, String] = param2Idx.map(_.swap) + + def getParamNum: Int = numParams + + def addParams(params: List[ParamSpace[Double]]): Unit = { + params.foreach(addParam) + } + + def addParam(param: ParamSpace[Double]): Unit = { + if (!paramDict.contains(param.name)) { + fields += DataTypes.createStructField(param.name, DataTypes.DoubleType, false) + paramDict += (param.name -> param) + param2Idx += (param.name -> numParams) + idx2Param += (numParams -> param.name) + numParams += 1 + } + println(s"add param ${param.toString}, current params: ${paramDict.keySet.mkString(",")}") + } + + def getFields: Array[StructField] = fields.toArray + + def getParams: List[ParamSpace[Double]] = paramDict.values.toList + + def getParamByName(name: String): Option[ParamSpace[Double]] = paramDict.get(name) + + def getIdxByParam(name: String): Option[Int] = param2Idx.get(name) + + def getParamByIdx(idx: Int): Option[ParamSpace[Double]] = paramDict.get(idx2Param.getOrElse(idx, "none")) + + // TODO: Store historical configurations to avoid redundancy. + def sampleConfig(size: Int): List[Configuration] = { + var configs: ListBuffer[Configuration] = new ListBuffer[Configuration] + + var missing: Int = 0 + do { + missing = size - configs.length + println(s"num of params: $numParams") + var vectors: List[Vector] = List.fill(missing)(Vectors.dense(new Array[Double](numParams))) + param2Idx.foreach { case (paramName, paramIdx) => + paramDict.get(paramName) match { + case Some(param) => + param.sample(missing).zipWithIndex.foreach { case (f,i) => + vectors(i).toArray(paramIdx) = f + } + case None => LOG.info(s"Cannot find $paramName.") + } + } + vectors.filter(validConfig).foreach{ vec => + configs += new Configuration(this, vec) + } + } while(configs.length < size) + + configs.toList + } + + // TODO: Implement this func + def validConfig(vec: Vector): Boolean = true +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala new file mode 100644 index 000000000..b94975213 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -0,0 +1,86 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.parameter + +import com.tencent.angel.spark.ml.automl.utils.Distribution + +import scala.collection.mutable.ListBuffer +import scala.util.Random + +/** + * + * @param name: Name of the parameter + * @param lower: Start of the continuous space included. + * @param upper: End of the continuous space included. + * @param num: Sampling count if possible. + * @param seed + */ +class ContinuousSpace( + override val name: String, + lower: Double, + upper: Double, + num: Int, + distribution: Distribution.Value = Distribution.LINEAR, + seed: Int = 100) extends ParamSpace[Double](name) { + + val rd = new Random(seed) + val values: List[Double] = calValues + + def calValues(): List[Double] = { + var ret: ListBuffer[Double] = ListBuffer[Double]() + distribution match { + case Distribution.LINEAR => + val interval: Double = (upper - lower) / (num - 1) + (0 until num).foreach { i => + ret += lower + i * interval + } + case _ => println(s"Distribution $distribution not supported") + } + + ret.toList + } + + def getLower: Double = lower + + def getUpper: Double = upper + + def getValues: List[Double] = values + + def numValues: Int = num + + def toGridSearch: ParamSpace[Double] = this + + def toRandomSpace: ParamSpace[Double] = this + + override def sample(size: Int): List[Double] = List.fill(size)(sample) + + override def sample: Double = values(rd.nextInt(numValues)) + + override def toString: String = s"ContinuousSpace[$name]: (${values mkString(",")})" + +} + +object ContinuousSpace { + + def main(args: Array[String]): Unit = { + val obj = new ContinuousSpace("test", 0, 10, 5) + println(obj.toString) + println(obj.sample(2).toString()) + } +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala new file mode 100644 index 000000000..32ed2318f --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -0,0 +1,58 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.parameter + +import scala.util.Random + +/** + * Search space with discrete values + * + * @param name: Name of the parameter + * @param values: List of all possible values + */ +class DiscreteSpace[T: Numeric]( + override val name: String, + values: List[T], + seed: Int = 100) extends ParamSpace[T](name) { + + val rd = new Random(seed) + + def getValues: List[T] = values + + def numValues: Int = values.length + + def toGridSearch: ParamSpace[T] = this + + def toRandomSpace: ParamSpace[T] = this + + override def sample(size: Int): List[T] = List.fill(size)(sample) + + override def sample: T = values(rd.nextInt(numValues)) + + override def toString: String = s"DiscreteSpace[$name]: (${values mkString(",")})" +} + +object DiscreteSpace { + + def main(args: Array[String]): Unit = { + val obj = new DiscreteSpace[Float]("test", List(1.0f, 2.0f, 3.0f, 4.0f, 5.0f)) + println(obj.toString) + println(obj.sample(2).toString()) + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala new file mode 100644 index 000000000..55ab25e40 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -0,0 +1,32 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.parameter + +/** + * Base class of a single parameter's search space. + * + * @param name: Name of the parameter + */ +abstract class ParamSpace[T: Numeric](val name: String) { + + def sample(size: Int): List[T] + + def sample: T + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala new file mode 100644 index 000000000..4ad8f67c2 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -0,0 +1,62 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.solver + +import com.tencent.angel.spark.ml.automl.tuner.TunerParam +import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.AcqOptimizer +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import org.apache.spark.ml.linalg.Vector +import org.apache.commons.logging.{Log, LogFactory} + +class Solver( + val cs: ConfigurationSpace, + val surrogate: Surrogate, + val acqFuc: Acquisition, + val optimizer: AcqOptimizer) { + + val LOG: Log = LogFactory.getLog(classOf[Solver]) + + def getObservations: (List[Vector], List[Double]) = (surrogate.curX.toList, surrogate.curY.toList) + + def getSurrogate: Surrogate = surrogate + + /** + * Suggests configurations to evaluate. + */ + def suggest(): List[Configuration] = { + //println(s"suggest configurations") + optimizer.maximize(TunerParam.batchSize).map(_._2) + } + + /** + * Feed evaluation result to the model + * @param configs: More evaluated configurations + * @param Y: More evaluation result + */ + def feed(configs: List[Configuration], Y: List[Double]): Unit = { + //println(s"feed ${configs.size} configurations") + surrogate.update(configs.map(_.getVector), Y) + } + + def feed(config: Configuration, y: Double): Unit = { + surrogate.update(config.getVector, y) + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala new file mode 100644 index 000000000..da8898a0d --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala @@ -0,0 +1,46 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.solver + +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.trail.Trail +import org.apache.spark.ml.linalg.Vector + +class SolverWithTrail(val solver: Solver, val trail: Trail) { + + /** + * The main Bayesian optimization loop + * + * @param numIter : Number of Iterations + * @param X : Initial data points that are already evaluated + * @param Y : Initial function values of the already evaluated points + * @return Incumbent and function value of the incumbent + */ + def run(numIter: Int, X: List[Configuration] = Nil, Y: List[Double] = Nil): (Vector, Double) = { + if (X != Nil && Y != Nil && X.size == Y.size) + solver.feed(X, Y) + (0 until numIter).foreach{ iter => + println(s"------iteration $iter starts------") + val configs: List[Configuration] = solver.suggest + val results: List[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + solver.surrogate.curBest + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala new file mode 100644 index 000000000..00b02e10d --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -0,0 +1,96 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.surrogate + +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import org.apache.spark.ml.linalg.Vector +import com.tencent.angel.spark.ml.automl.utils.DataUtils +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.ml.regression.{DecisionTreeRegressionModel, RandomForestRegressionModel, RandomForestRegressor} +import org.apache.spark.sql.{DataFrame, SparkSession} +import org.apache.spark.{SparkConf, SparkContext} + +class RFSurrogate( + override val cs: ConfigurationSpace, + override val minimize: Boolean = true) + extends Surrogate(cs, minimize) { + + override val LOG: Log = LogFactory.getLog(classOf[RFSurrogate]) + + var model: RandomForestRegressionModel = _ + val numTrees: Int = 5 + val maxDepth: Int = 2 + //val conf = new SparkConf().setMaster("local").setAppName("RandomForest") + //val sc = new SparkContext(conf) + //sc.setLogLevel("ERROR") + val ss = SparkSession.builder() + .master("local") + .appName("test") + .getOrCreate() + + override def train(): Unit = { + + if (curX.size < Math.pow(2, maxDepth - 1)) + return + + val data: DataFrame = DataUtils.parse(ss, schema, curX.toList, curY.toList) + + + val rf = new RandomForestRegressor() + .setLabelCol("label") + .setFeaturesCol("features") + .setNumTrees(numTrees) + .setMaxDepth(maxDepth) + + model = rf.fit(data) + + } + + /** + * Predict means and variances for a single given X. + * + * @param X + * @return a tuple of (mean, variance) + */ + override def predict(X: Vector): (Double, Double) = { + + if (curX.size < Math.pow(2, maxDepth - 1)) { + return (0.0, 0.0) + } + + val preds = model.trees.map{ tree: DecisionTreeRegressionModel => + val pred = tree.transform(DataUtils.parse(ss, schema, X)) + pred.select("prediction").first().getDouble(0) + } + + println(s"predict of ${X.toArray.mkString(",")}: ${preds.mkString(",")}") + + val mean: Double = preds.sum / preds.length + val variance = preds.map(x => Math.pow(x - mean, 2)).sum / preds.length + + println(s"prediction mean $mean variance $variance") + + (mean, variance) + } + + override def stop(): Unit = { + ss.stop + } + +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala new file mode 100644 index 000000000..80c920981 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -0,0 +1,134 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.surrogate + +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import org.apache.spark.ml.linalg.Vector +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.sql.types.{DataTypes, StructField, StructType} + +import scala.collection.mutable.{ArrayBuffer, ListBuffer} + +/** + * Abstract base class for surrogate model. + * @param numParams : Number of parameters in a configuration + */ +abstract class Surrogate( + val cs: ConfigurationSpace, + val minimize: Boolean = true) { + + var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() + fields += DataTypes.createStructField("label", DataTypes.DoubleType, false) + fields += DataTypes.createStructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) + + val schema: StructType = StructType( + StructField("label", DataTypes.DoubleType, nullable = false) :: + StructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) :: + Nil) + + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + // Input data points, (N, D) + var curX: ListBuffer[Vector] = new ListBuffer[Vector]() + // Target value, (N, ) + var curY: ListBuffer[Double] = new ListBuffer[Double]() + + /** + * Train the surrogate on curX and curY. + */ + def train(): Unit + + /** + * Train the surrogate on X and Y. + * + * @param X : (N, D), input data points. + * @param Y : (N, 1), the corresponding target values. + */ + def train(X: List[Vector], Y: List[Double]): Unit = { + curX.clear + curY.clear + curX ++ X + curY ++ Y + train + } + + /** + * Update the surrogate with more X and Y. + * + * @param X + * @param Y + */ + def update(X: List[Vector], Y: List[Double]): Unit = { + X.zip(Y).foreach( tuple => print(tuple._1, tuple._2) ) + curX ++= X + curY ++= Y + train + } + + def print(X: Vector, y: Double): Unit = { + println(s"update surrogate with X: ${X.toArray.mkString(",")} and Y: $y") + } + + def update(X: Vector, y: Double): Unit = { + print(X, y) + curX += X + curY += y + train + } + + /** + * Predict means and variances for given X. + * + * @param X + * @return tuples of (mean, variance) + */ + def predict(X: List[Vector]): List[(Double, Double)] = { + X.map(predict) + } + + /** + * Predict means and variances for a single given X. + * + * @param X + * @return a tuple of (mean, variance) + */ + def predict(X: Vector): (Double, Double) + + def stop(): Unit + + def curBest: (Vector, Double) = { + if (minimize) curMin else curMax + } + + def curMin: (Vector, Double) = { + if (curY.isEmpty) (null, Double.MaxValue) + else { + val minIdx: Int = curY.zipWithIndex.min._2 + (curX(minIdx), curY(minIdx)) + } + } + + def curMax: (Vector, Double) = { + if (curY.isEmpty) (null, Double.MinValue) + else { + val maxIdx: Int = curY.zipWithIndex.max._2 + (curX(maxIdx), curY(maxIdx)) + } + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala new file mode 100644 index 000000000..b1f525419 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala @@ -0,0 +1,35 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.trail + + +import com.github.fommil.netlib.{BLAS => NetlibBLAS, F2jBLAS} +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration + +class TestRunner(config: Configuration) extends TrailRunner(config) { + + override def call(): Double = { + new F2jBLAS().ddot(config.getVector.size, + config.getVector.toDense.values, + 1, + config.getVector.toDense.values, + 1) + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala new file mode 100644 index 000000000..bbc76dd48 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala @@ -0,0 +1,35 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.trail + +import com.github.fommil.netlib.{BLAS => NetlibBLAS, F2jBLAS} +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration + +class TestTrail extends Trail { + + override def evaluate(config: Configuration): Double = { + val ret = new F2jBLAS().ddot(config.getVector.size, + config.getVector.toDense.values, + 1, + config.getVector.toDense.values, + 1) + println(s"evaluate ${config.getVector.toArray.mkString(",")}, result $ret") + ret + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala new file mode 100644 index 000000000..a207ad8cd --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala @@ -0,0 +1,29 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.trail + +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration + +abstract class Trail { + + def evaluate(configs: List[Configuration]): List[Double] = configs.map(evaluate) + + def evaluate(config: Configuration): Double + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala new file mode 100644 index 000000000..b9d998321 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala @@ -0,0 +1,32 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.trail + +import java.util.concurrent.Callable + +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration + +abstract class TrailRunner(var config: Configuration) extends Callable[Double]{ + + override def call(): Double + + def setConf(newConf: Configuration): Unit = { + config = newConf + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala new file mode 100644 index 000000000..cc34d666c --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.utils + +import org.apache.spark.ml.linalg.Vector +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.DataFrame +import org.apache.spark.sql.types.StructType + +object DataUtils { + + def parse(ss: SparkSession, + schema: StructType, + X: List[Vector], + Y: List[Double]): DataFrame = { + require(X.size == Y.size, + "The size of configurations should be equal to the size of rewards.") + ss.createDataFrame( + Y.zip(X)).toDF("label", "features") + } + + def parse(ss: SparkSession, + schema: StructType, + X: Vector): DataFrame = { + parse(ss, schema, List(X), List(0)) + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala new file mode 100644 index 000000000..fda53d886 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala @@ -0,0 +1,30 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.utils + +object Distribution extends Enumeration { + + type Distribution = Value + + val LINEAR = Value("1") + + def checkExists(distribution: String): Boolean = this.values.exists(_.toString == distribution) + + def printAll(): Unit = this.values.foreach(println) +} From 4c4227d7a1e66b4311388e266088c3382118ab89 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 11 Dec 2018 23:15:20 +0800 Subject: [PATCH 022/115] conf of preprocess, dataframe loader, a start of preprocess --- .../angel/spark/ml/automl/AutoConf.scala | 50 ++++++++ .../spark/ml/automl/feature/DataLoader.scala | 110 ++++++++++++++++++ .../feature/{ => cross}/FeatureCross.scala | 4 +- .../feature/preprocess/FPreprocess.scala | 69 +++++++++++ .../TPreprocess.scala} | 8 +- .../{ => select}/FeatureSelector.scala | 4 +- .../automl/feature/transform/FTransform.scala | 23 ++++ 7 files changed, 262 insertions(+), 6 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/{ => cross}/FeatureCross.scala (95%) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/{PreProcessing.scala => preprocess/TPreprocess.scala} (91%) rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/{ => select}/FeatureSelector.scala (95%) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala new file mode 100644 index 000000000..31e10c842 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala @@ -0,0 +1,50 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl + +object AutoConf { + + object Preprocess { + + val INPUT_TYPE = "ml.input.type" + val DEFAULT_INPUT_TYPE = "normal" + + val SAMPLE_RATE = "ml.sample.rate" + val DEFAULT_SAMPLE_RATE = "1.0" + + val IMBALANCE_SAMPLE = "ml.imbalance.sample" + val DEFAULT_IMBALANCE_SAMPLE = "false" + + val HAS_DISCRETER = "ml.has.discreter" + val DEFAULT_HAS_DISCRETER = "false" + + val HAS_ONEHOTER = "ml.has.onehoter" + val DEFAULT_HAS_ONEHOTER = "false" + + val HAS_MINMAXSCALAR = "ml.has.minmaxscalar" + val DEFAULT_HAS_MINMAXSCALAR = "true" + + val HAS_STANDARDSCALAR = "ml.has.standardscalar" + val DEFAULT_HAS_STANDARDSCALAR = "false" + + } + +} + +class AutoConf {} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala new file mode 100644 index 000000000..7c73f8da5 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala @@ -0,0 +1,110 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.sql.{DataFrame, SparkSession} + +abstract class DataLoader(ss: SparkSession) { + def load(input: String, separator: String): DataFrame + def load(input: String): DataFrame = load(input, " ") +} + +case class LibSVMDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.read.format("libsvm").load(input) + } +} + +case class CSVDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.read.csv(input) + } +} + +case class JSONDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.read.json(input) + } +} + +case class DocumentDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.createDataFrame( + ss.sparkContext.textFile(input).map(Tuple1.apply) + ).toDF("sentence") + } +} + +case class LabeledDocumentDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + require(separator.equals(","), + "the label and sentence should be separated by comma") + ss.createDataFrame( + ss.sparkContext.textFile(input) + .map{ line => + val splits = line.split(separator) + (splits(0), splits(1)) + }) + .toDF("label", "sentence") + } + + override def load(input: String): DataFrame = load(input, ",") +} + +case class SimpleDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.createDataFrame( + ss.sparkContext.textFile(input) + .map(_.split(separator)).map(Tuple1.apply) + ).toDF("features") + } +} + +case class LabeledSimpleDataLoader(ss: SparkSession) extends DataLoader(ss) { + override def load(input: String, separator: String): DataFrame = { + ss.createDataFrame( + ss.sparkContext.textFile(input) + .map{ line => + val splits = line.split(separator) + (splits.head, splits.tail) + } + ).toDF("label", "features") + } +} + + +object DataLoader { + + def load(ss: SparkSession, + format: String, + input: String, + separator: String = " "): DataFrame = { + format match { + case "libsvm" => LibSVMDataLoader(ss).load(input) + case "csv" => CSVDataLoader(ss).load(input) + case "json" => JSONDataLoader(ss).load(input) + case "document" => DocumentDataLoader(ss).load(input, separator) + case "label-document" => LabeledDocumentDataLoader(ss).load(input, separator) + case "simple" => SimpleDataLoader(ss).load(input, separator) + case "label-simple" => LabeledSimpleDataLoader(ss).load(input, separator) + case _ => SimpleDataLoader(ss).load(input, separator) + } + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala index 29ba3da54..ac1e0f8ff 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureCross.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala @@ -16,13 +16,13 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.ml.automl.feature.cross import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.DefaultParamsWritable -import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.{DataFrame, Dataset} class FeatureCross (override val uid: String) extends Transformer with DefaultParamsWritable { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala new file mode 100644 index 000000000..f6d1f5893 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala @@ -0,0 +1,69 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.spark.ml.automl.AutoConf +import com.tencent.angel.spark.ml.automl.feature.DataLoader +import com.tencent.angel.spark.ml.core.ArgsUtil + + +import org.apache.spark.sql.SparkSession + + +object FPreprocess { + + def main(args: Array[String]): Unit = { + + val params = ArgsUtil.parse(args) + val master = params.getOrElse("master", "yarn") + val deploy = params.getOrElse("deploy-mode", "cluster") + val input = params.getOrElse("input", "") + val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, + MLConf.DEFAULT_ML_DATA_SPLITOR) + val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, + MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) + val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, + AutoConf.Preprocess.DEFAULT_INPUT_TYPE) + val sampleRate = params.getOrElse(AutoConf.Preprocess.SAMPLE_RATE, + AutoConf.Preprocess.DEFAULT_SAMPLE_RATE + ) + val imbalanceSampleRate = params.getOrElse(AutoConf.Preprocess.IMBALANCE_SAMPLE, + AutoConf.Preprocess.DEFAULT_IMBALANCE_SAMPLE) + val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, + AutoConf.Preprocess.DEFAULT_HAS_DISCRETER) + val hasOnehoter = params.getOrElse(AutoConf.Preprocess.HAS_ONEHOTER, + AutoConf.Preprocess.DEFAULT_HAS_ONEHOTER) + val hasMinMaxScalar = params.getOrElse(AutoConf.Preprocess.HAS_MINMAXSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_MINMAXSCALAR) + val hasStdScalar = params.getOrElse(AutoConf.Preprocess.HAS_STANDARDSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_STANDARDSCALAR) + + val ss = SparkSession + .builder + .master(master + "-" + deploy) + .appName("preprocess") + .getOrCreate() + + val data = DataLoader.load(ss, inputFormat, input, inputSeparator) + + + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala similarity index 91% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala index ddd674cc2..cec5f841a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PreProcessing.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.ml.automl.feature.preprocess import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap @@ -24,7 +24,7 @@ import org.apache.spark.ml.util.DefaultParamsWritable import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType -class PreProcessing (override val uid: String) +class TPreprocess (override val uid: String) extends Transformer with DefaultParamsWritable { override def transform(dataset: Dataset[_]): DataFrame = ??? @@ -33,3 +33,7 @@ class PreProcessing (override val uid: String) override def transformSchema(schema: StructType): StructType = ??? } + + + + diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala index 7e92d785b..86f6d0c33 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/FeatureSelector.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala @@ -16,13 +16,13 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.ml.automl.feature.select import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.DefaultParamsWritable -import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.{DataFrame, Dataset} class FeatureSelector (override val uid: String) extends Transformer with DefaultParamsWritable { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala new file mode 100644 index 000000000..a5f7bec10 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala @@ -0,0 +1,23 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.transform + +class FTransform { + +} From 56efbc3e853074669306af0b7f4ae868b68b9f79 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 12 Dec 2018 09:03:08 +0800 Subject: [PATCH 023/115] add tokenizer and stopwordremover --- .../feature/preprocess/Components.scala | 52 +++++++++++++++++++ .../feature/preprocess/FPreprocess.scala | 34 ++++++++---- .../automl/feature/transform/FTransform.scala | 24 +++++++++ 3 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala new file mode 100644 index 000000000..4fd3cf4b8 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala @@ -0,0 +1,52 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import org.apache.spark.ml.PipelineStage +import org.apache.spark.ml.feature.{StopWordsRemover, Tokenizer} + +import scala.collection.mutable.ArrayBuffer + +object Components { + + def addSampler(components: ArrayBuffer[PipelineStage], + inputCol: String, + outputCol: String): Unit = { + + } + + def addTokenizer(components: ArrayBuffer[PipelineStage], + inputCol: String, + outputCol: String): Unit = { + val tokenizer = new Tokenizer() + .setInputCol(inputCol) + .setOutputCol(outputCol) + components += tokenizer + } + + def addStopWordsRemover(components: ArrayBuffer[PipelineStage], + inputCol: String, + outputCol: String): Unit = { + val remover = new StopWordsRemover() + .setInputCol(inputCol) + .setOutputCol(outputCol) + components += remover + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala index f6d1f5893..de38d22c1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala @@ -22,10 +22,11 @@ import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.spark.ml.automl.AutoConf import com.tencent.angel.spark.ml.automl.feature.DataLoader import com.tencent.angel.spark.ml.core.ArgsUtil - - +import org.apache.spark.ml.{Pipeline, PipelineStage} import org.apache.spark.sql.SparkSession +import scala.collection.mutable.ArrayBuffer + object FPreprocess { @@ -46,14 +47,8 @@ object FPreprocess { ) val imbalanceSampleRate = params.getOrElse(AutoConf.Preprocess.IMBALANCE_SAMPLE, AutoConf.Preprocess.DEFAULT_IMBALANCE_SAMPLE) - val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, - AutoConf.Preprocess.DEFAULT_HAS_DISCRETER) - val hasOnehoter = params.getOrElse(AutoConf.Preprocess.HAS_ONEHOTER, - AutoConf.Preprocess.DEFAULT_HAS_ONEHOTER) - val hasMinMaxScalar = params.getOrElse(AutoConf.Preprocess.HAS_MINMAXSCALAR, - AutoConf.Preprocess.DEFAULT_HAS_MINMAXSCALAR) - val hasStdScalar = params.getOrElse(AutoConf.Preprocess.HAS_STANDARDSCALAR, - AutoConf.Preprocess.DEFAULT_HAS_STANDARDSCALAR) + val hasTokenizer = if (inputFormat.equals("document")) true else false + val hasStopWordsRemover = if (inputFormat.equals("document")) true else false val ss = SparkSession .builder @@ -61,8 +56,25 @@ object FPreprocess { .appName("preprocess") .getOrCreate() - val data = DataLoader.load(ss, inputFormat, input, inputSeparator) + val training = DataLoader.load(ss, inputFormat, input, inputSeparator) + + var components = new ArrayBuffer[PipelineStage] + + if (hasTokenizer) + Components.addTokenizer(components, + "sentence", "words") + + if (hasTokenizer) + Components.addTokenizer(components, + "words", "filterWords") + + + val pipeline = new Pipeline() + .setStages(components.toArray) + + val model = pipeline.fit(training) + ss.stop() } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala index a5f7bec10..66bd25054 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala @@ -18,6 +18,30 @@ package com.tencent.angel.spark.ml.automl.feature.transform +import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.spark.ml.automl.AutoConf +import com.tencent.angel.spark.ml.core.ArgsUtil + class FTransform { + val params = ArgsUtil.parse(args) + val master = params.getOrElse("master", "yarn") + val deploy = params.getOrElse("deploy-mode", "cluster") + val input = params.getOrElse("input", "") + val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, + MLConf.DEFAULT_ML_DATA_SPLITOR) + val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, + MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) + val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, + AutoConf.Preprocess.DEFAULT_INPUT_TYPE) + val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, + AutoConf.Preprocess.DEFAULT_HAS_DISCRETER) + val hasOnehoter = params.getOrElse(AutoConf.Preprocess.HAS_ONEHOTER, + AutoConf.Preprocess.DEFAULT_HAS_ONEHOTER) + val hasMinMaxScalar = params.getOrElse(AutoConf.Preprocess.HAS_MINMAXSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_MINMAXSCALAR) + val hasStdScalar = params.getOrElse(AutoConf.Preprocess.HAS_STANDARDSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_STANDARDSCALAR) + + } From caa0c7b90b841d49a517f7b2560fa9c0c098eeb1 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 12 Dec 2018 09:07:34 +0800 Subject: [PATCH 024/115] bug fix --- .../automl/feature/transform/FTransform.scala | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala index 66bd25054..10d501193 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala @@ -24,24 +24,26 @@ import com.tencent.angel.spark.ml.core.ArgsUtil class FTransform { - val params = ArgsUtil.parse(args) - val master = params.getOrElse("master", "yarn") - val deploy = params.getOrElse("deploy-mode", "cluster") - val input = params.getOrElse("input", "") - val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, - MLConf.DEFAULT_ML_DATA_SPLITOR) - val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, - MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) - val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, - AutoConf.Preprocess.DEFAULT_INPUT_TYPE) - val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, - AutoConf.Preprocess.DEFAULT_HAS_DISCRETER) - val hasOnehoter = params.getOrElse(AutoConf.Preprocess.HAS_ONEHOTER, - AutoConf.Preprocess.DEFAULT_HAS_ONEHOTER) - val hasMinMaxScalar = params.getOrElse(AutoConf.Preprocess.HAS_MINMAXSCALAR, - AutoConf.Preprocess.DEFAULT_HAS_MINMAXSCALAR) - val hasStdScalar = params.getOrElse(AutoConf.Preprocess.HAS_STANDARDSCALAR, - AutoConf.Preprocess.DEFAULT_HAS_STANDARDSCALAR) + def main(args: Array[String]): Unit = { + val params = ArgsUtil.parse(args) + val master = params.getOrElse("master", "yarn") + val deploy = params.getOrElse("deploy-mode", "cluster") + val input = params.getOrElse("input", "") + val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, + MLConf.DEFAULT_ML_DATA_SPLITOR) + val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, + MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) + val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, + AutoConf.Preprocess.DEFAULT_INPUT_TYPE) + val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, + AutoConf.Preprocess.DEFAULT_HAS_DISCRETER) + val hasOnehoter = params.getOrElse(AutoConf.Preprocess.HAS_ONEHOTER, + AutoConf.Preprocess.DEFAULT_HAS_ONEHOTER) + val hasMinMaxScalar = params.getOrElse(AutoConf.Preprocess.HAS_MINMAXSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_MINMAXSCALAR) + val hasStdScalar = params.getOrElse(AutoConf.Preprocess.HAS_STANDARDSCALAR, + AutoConf.Preprocess.DEFAULT_HAS_STANDARDSCALAR) + } } From 557b1ee4e2faa6cecb1b3555e21c3038ba37cca8 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 12 Dec 2018 09:10:29 +0800 Subject: [PATCH 025/115] bug fix --- .../spark/ml/automl/feature/preprocess/FPreprocess.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala index de38d22c1..618ae8698 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala @@ -64,8 +64,8 @@ object FPreprocess { Components.addTokenizer(components, "sentence", "words") - if (hasTokenizer) - Components.addTokenizer(components, + if (hasStopWordsRemover) + Components.addStopWordsRemover(components, "words", "filterWords") From 0d74c0bc29724a4399897652932ade9e3e4c7582 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 12 Dec 2018 10:29:16 +0800 Subject: [PATCH 026/115] implement Sampler with Transformer --- .../feature/preprocess/Components.scala | 12 ++- .../feature/preprocess/FPreprocess.scala | 10 ++- .../automl/feature/preprocess/Sampler.scala | 90 +++++++++++++++++++ 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala index 4fd3cf4b8..dda3335b3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala @@ -20,15 +20,23 @@ package com.tencent.angel.spark.ml.automl.feature.preprocess import org.apache.spark.ml.PipelineStage import org.apache.spark.ml.feature.{StopWordsRemover, Tokenizer} +import org.apache.spark.sql.DataFrame import scala.collection.mutable.ArrayBuffer object Components { + def sample(data: DataFrame, + fraction: Double): DataFrame = { + data.sample(false, fraction) + } + def addSampler(components: ArrayBuffer[PipelineStage], inputCol: String, - outputCol: String): Unit = { - + fraction: Double): Unit = { + val sampler = new Sampler(fraction) + .setInputCol("features") + components += sampler } def addTokenizer(components: ArrayBuffer[PipelineStage], diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala index 618ae8698..7278fbcb1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala @@ -44,7 +44,7 @@ object FPreprocess { AutoConf.Preprocess.DEFAULT_INPUT_TYPE) val sampleRate = params.getOrElse(AutoConf.Preprocess.SAMPLE_RATE, AutoConf.Preprocess.DEFAULT_SAMPLE_RATE - ) + ).toDouble val imbalanceSampleRate = params.getOrElse(AutoConf.Preprocess.IMBALANCE_SAMPLE, AutoConf.Preprocess.DEFAULT_IMBALANCE_SAMPLE) val hasTokenizer = if (inputFormat.equals("document")) true else false @@ -56,10 +56,14 @@ object FPreprocess { .appName("preprocess") .getOrCreate() - val training = DataLoader.load(ss, inputFormat, input, inputSeparator) + var training = DataLoader.load(ss, inputFormat, input, inputSeparator) var components = new ArrayBuffer[PipelineStage] + if (sampleRate > 0 & sampleRate < 1.0) + Components.addSampler(components, + "features", sampleRate) + if (hasTokenizer) Components.addTokenizer(components, "sentence", "words") @@ -68,14 +72,12 @@ object FPreprocess { Components.addStopWordsRemover(components, "words", "filterWords") - val pipeline = new Pipeline() .setStages(components.toArray) val model = pipeline.fit(training) ss.stop() - } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala new file mode 100644 index 000000000..a996a2794 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala @@ -0,0 +1,90 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import org.apache.spark.ml.linalg.Vector +import org.apache.spark.ml.{Pipeline, Transformer} +import org.apache.spark.ml.param.{Param, ParamMap} +import org.apache.spark.ml.util.Identifiable +import org.apache.spark.sql.{Row, DataFrame, Dataset, SparkSession} +import org.apache.spark.sql.types.StructType + + +class Sampler(fraction: Double, override val uid: String) + extends Transformer { + + def this(fraction: Double) = this(fraction, Identifiable.randomUID("sampler")) + + /** + * Param for input column name. + * @group param + */ + final val inputCol: Param[String] = new Param[String](this, "inputCol", "input column name") + + /** @group setParam */ + final def setInputCol(value: String): this.type = set(inputCol, value) + + /** @group getParam */ + final def getInputCol: String = $(inputCol) + + override def transform(dataset: Dataset[_]): DataFrame = { + dataset.sample(false, fraction).toDF + } + + override def transformSchema(schema: StructType): StructType = { schema } + + override def copy(extra: ParamMap): Sampler = defaultCopy(extra) +} + +object Sampler { + + def main(args: Array[String]): Unit = { + val ss = SparkSession + .builder + .master("local") + .appName("preprocess") + .getOrCreate() + + val training = ss.read.format("libsvm") + .load("/Users/jiangjiawei/dev-tools/spark-2.2.0/data/mllib/sample_libsvm_data.txt") + + println(training.count) + + val sampler = new Sampler(0.5) + .setInputCol("features") + + val pipeline = new Pipeline() + .setStages(Array(sampler)) + + val model = pipeline.fit(training) + + val test = ss.read.format("libsvm") + .load("/Users/jiangjiawei/dev-tools/spark-2.2.0/data/mllib/sample_libsvm_data.txt") + + model.transform(test).select("*") + .collect() + .foreach { case Row(label: Double, vector: Vector) => + println(s"($label, " + + s"${vector.toSparse.indices.mkString("[", ",", "]")}, " + + s"${vector.toSparse.values.mkString("[", ",", "]")}") + } + + ss.stop() + } +} \ No newline at end of file From fa00dab401794252477448dbf1ca8d768d19c531 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 12 Dec 2018 10:34:49 +0800 Subject: [PATCH 027/115] add seed to Sampler --- .../spark/ml/automl/feature/preprocess/Sampler.scala | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala index a996a2794..80fa773d6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala @@ -22,11 +22,15 @@ import org.apache.spark.ml.linalg.Vector import org.apache.spark.ml.{Pipeline, Transformer} import org.apache.spark.ml.param.{Param, ParamMap} import org.apache.spark.ml.util.Identifiable -import org.apache.spark.sql.{Row, DataFrame, Dataset, SparkSession} +import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession} import org.apache.spark.sql.types.StructType +import scala.util.Random -class Sampler(fraction: Double, override val uid: String) + +class Sampler(fraction: Double, + override val uid: String, + seed: Int = Random.nextInt) extends Transformer { def this(fraction: Double) = this(fraction, Identifiable.randomUID("sampler")) @@ -44,7 +48,7 @@ class Sampler(fraction: Double, override val uid: String) final def getInputCol: String = $(inputCol) override def transform(dataset: Dataset[_]): DataFrame = { - dataset.sample(false, fraction).toDF + dataset.sample(false, fraction, seed).toDF } override def transformSchema(schema: StructType): StructType = { schema } From 0a38e822dba836996198410339bc1b88977b41ca Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 14 Dec 2018 10:36:29 +0800 Subject: [PATCH 028/115] wrapper of spark.ml transformer --- .../ml/automl/feature/PipelineBuilder.scala | 30 ++++++++++ .../automl/feature/TransformerWrapper.scala | 56 +++++++++++++++++++ .../feature/preprocess/SamplerWrapper.scala | 41 ++++++++++++++ .../preprocess/StopWordsRemoverWrapper.scala | 39 +++++++++++++ .../feature/preprocess/TokenizerWrapper.scala | 40 +++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala new file mode 100644 index 000000000..8bddd7240 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala @@ -0,0 +1,30 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.PipelineStage +import org.apache.spark.ml.Transformer + +object PipelineBuilder { + + def declareFields(pipeline: Array[PipelineStage]): Unit = { + + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala new file mode 100644 index 000000000..a3d09ad26 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala @@ -0,0 +1,56 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Transformer + +import scala.collection.mutable.ArrayBuffer + +abstract class TransformerWrapper { + + val transformer: Transformer + var parentTransformer: Transformer + + val requiredInputCols: Array[String] + val requiredOutputCols: Array[String] + + val inputCols: ArrayBuffer[String] + val outputCols: ArrayBuffer[String] + + var parentCols: Array[String] + + def getTransformer: Transformer = transformer + + def setParent(parent: Transformer) = parentTransformer = parent + + def hasInputCol: Boolean + + def hasOutputCol: Boolean + + def getInputCols: Array[String] = inputCols.toArray + + def getOutputCols: Array[String] = outputCols.toArray + + def addInputCol(col: String): Unit = inputCols += col + + def addOutputCol(col: String): Unit = outputCols += col + + def setParentCols: Array[String] = parentCols + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala new file mode 100644 index 000000000..ab9d139ef --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala @@ -0,0 +1,41 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import org.apache.spark.ml.Transformer + +import scala.collection.mutable.ArrayBuffer + +class SamplerWrapper(fraction: Double) extends TransformerWrapper { + + override val transformer: Transformer = new Sampler(fraction) + + override var parentTransformer: Transformer = _ + override var parentCols: Array[String] = _ + override val requiredInputCols: Array[String] = null + override val requiredOutputCols: Array[String] = null + override val inputCols: ArrayBuffer[String] = new ArrayBuffer[String]() + override val outputCols: ArrayBuffer[String] = new ArrayBuffer[String]() + + override def hasInputCol: Boolean = true + + override def hasOutputCol: Boolean = false + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala new file mode 100644 index 000000000..ce98b1933 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -0,0 +1,39 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import org.apache.spark.ml.Transformer + +import scala.collection.mutable.ArrayBuffer +import org.apache.spark.ml.feature.StopWordsRemover + +class StopWordsRemoverWrapper extends TransformerWrapper { + + override val transformer: Transformer = new StopWordsRemover() + override var parentTransformer: Transformer = _ + override val requiredInputCols: Array[String] = Array("words") + override val requiredOutputCols: Array[String] = Array("filteredwords") + override val inputCols: ArrayBuffer[String] = _ + override val outputCols: ArrayBuffer[String] = _ + override var parentCols: Array[String] = _ + + override def hasInputCol: Boolean = true + + override def hasOutputCol: Boolean = true +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala new file mode 100644 index 000000000..c7bbbcd3f --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala @@ -0,0 +1,40 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import org.apache.spark.ml.Transformer + +import scala.collection.mutable.ArrayBuffer +import org.apache.spark.ml.feature.Tokenizer + +class TokenizerWrapper extends TransformerWrapper { + + override val transformer: Transformer = new Tokenizer() + override var parentTransformer: Transformer = _ + override val requiredInputCols: Array[String] = Array("sentence") + override val requiredOutputCols: Array[String] = Array("words") + override val inputCols: ArrayBuffer[String] = _ + override val outputCols: ArrayBuffer[String] = _ + override var parentCols: Array[String] = _ + + override def hasInputCol: Boolean = true + + override def hasOutputCol: Boolean = true +} From d194a946cfc2a79afae514640b104ed12c01a9a1 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 14 Dec 2018 10:39:43 +0800 Subject: [PATCH 029/115] code format --- .../spark/ml/automl/feature/preprocess/SamplerWrapper.scala | 6 ++++-- .../automl/feature/preprocess/StopWordsRemoverWrapper.scala | 3 +++ .../ml/automl/feature/preprocess/TokenizerWrapper.scala | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala index ab9d139ef..016a807f0 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala @@ -26,14 +26,16 @@ import scala.collection.mutable.ArrayBuffer class SamplerWrapper(fraction: Double) extends TransformerWrapper { override val transformer: Transformer = new Sampler(fraction) - override var parentTransformer: Transformer = _ - override var parentCols: Array[String] = _ + override val requiredInputCols: Array[String] = null override val requiredOutputCols: Array[String] = null + override val inputCols: ArrayBuffer[String] = new ArrayBuffer[String]() override val outputCols: ArrayBuffer[String] = new ArrayBuffer[String]() + override var parentCols: Array[String] = _ + override def hasInputCol: Boolean = true override def hasOutputCol: Boolean = false diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala index ce98b1933..19fecc442 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -27,10 +27,13 @@ class StopWordsRemoverWrapper extends TransformerWrapper { override val transformer: Transformer = new StopWordsRemover() override var parentTransformer: Transformer = _ + override val requiredInputCols: Array[String] = Array("words") override val requiredOutputCols: Array[String] = Array("filteredwords") + override val inputCols: ArrayBuffer[String] = _ override val outputCols: ArrayBuffer[String] = _ + override var parentCols: Array[String] = _ override def hasInputCol: Boolean = true diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala index c7bbbcd3f..63357e382 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala @@ -28,10 +28,13 @@ class TokenizerWrapper extends TransformerWrapper { override val transformer: Transformer = new Tokenizer() override var parentTransformer: Transformer = _ + override val requiredInputCols: Array[String] = Array("sentence") override val requiredOutputCols: Array[String] = Array("words") + override val inputCols: ArrayBuffer[String] = _ override val outputCols: ArrayBuffer[String] = _ + override var parentCols: Array[String] = _ override def hasInputCol: Boolean = true From d070c98a5072abce20ceff0a8a52182fef1fbdd0 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 17 Dec 2018 10:05:29 +0800 Subject: [PATCH 030/115] relations of Transformer inputs and outputs --- .../ml/automl/feature/InToOutRelation.scala | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala new file mode 100644 index 000000000..baa129397 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala @@ -0,0 +1,31 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.feature + +object InToOutRelation extends Enumeration { + + type InToOutRelation = Value + + val Fixed = Value("Fixed") + val InPlace = Value("InPlace") + val OneToOne = Value("OneToOne") + val MultiToMulti = Value("MultiToMulti") + val MultiToOne = Value("MultiToOne") + +} From 5a234a460b5a66986f067b97338cc8bb8db9d1a8 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 17 Dec 2018 10:06:05 +0800 Subject: [PATCH 031/115] improve transformer wrapper, gennerate input and output --- .../automl/feature/TransformerWrapper.scala | 79 +++++++++++++------ 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala index a3d09ad26..56f08926e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala @@ -19,38 +19,73 @@ package com.tencent.angel.spark.ml.automl.feature import org.apache.spark.ml.Transformer - -import scala.collection.mutable.ArrayBuffer +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InToOutRelation abstract class TransformerWrapper { val transformer: Transformer - var parentTransformer: Transformer + var parent: TransformerWrapper + + val relation: InToOutRelation + + val hasMultiInputs: Boolean + val hasMultiOutputs: Boolean + val needAncestorInputs: Boolean + private val prefix = "out_" val requiredInputCols: Array[String] val requiredOutputCols: Array[String] - val inputCols: ArrayBuffer[String] - val outputCols: ArrayBuffer[String] + private var inputCols: Array[String] = _ + private var outputCols: Array[String] = _ - var parentCols: Array[String] + private var ancestorCols: Array[String] = _ def getTransformer: Transformer = transformer - def setParent(parent: Transformer) = parentTransformer = parent - - def hasInputCol: Boolean - - def hasOutputCol: Boolean - - def getInputCols: Array[String] = inputCols.toArray - - def getOutputCols: Array[String] = outputCols.toArray - - def addInputCol(col: String): Unit = inputCols += col - - def addOutputCol(col: String): Unit = outputCols += col - - def setParentCols: Array[String] = parentCols - + def setParent(parent: TransformerWrapper): Unit = this.parent = parent + + def setInputCols(cols: Array[String]): Unit = inputCols = cols + + def setOutputCols(cols: Array[String]): Unit = outputCols = cols + + def getInputCols: Array[String] = inputCols + + def getOutputCols: Array[String] = outputCols + + def setAncestorCols(cols: Array[String]): Unit = ancestorCols = cols + + def generateInputCols(): Unit = { + require(ancestorCols.contains(requiredInputCols), "Missing required input cols.") + // if transformer has required input cols, feed required input cols + // if transformer needs all input cols, feed all input cols + // if transformer has no required input cols, feed the output cols of the parent transformer + if (ancestorCols.contains(requiredInputCols)) { + setInputCols(requiredInputCols) + } else if (needAncestorInputs) { + setInputCols(ancestorCols) + } else { + setInputCols(parent.outputCols) + } + } + + def generateOutputCols(): Unit = { + relation match { + case InToOutRelation.Fixed => + setOutputCols(requiredOutputCols) + case InToOutRelation.InPlace => + setOutputCols(inputCols) + case InToOutRelation.OneToOne => + setOutputCols(Array(prefix + inputCols(0))) + case InToOutRelation.MultiToMulti => + setOutputCols(inputCols.map(prefix + _)) + case InToOutRelation.MultiToOne => + setOutputCols(Array(prefix + transformer.getClass.getName.toLowerCase)) + case _ => + throw new IncompatibleFiledExecption( + "wrong relations between input and output of transformer") + } + } + + def declareInAndOut(): this.type } From 97a29827b4e1b6b4f8feef844ec9f706609d28ed Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 17 Dec 2018 10:06:31 +0800 Subject: [PATCH 032/115] implement several transformer wrapper --- .../automl/feature/preprocess/Sampler.scala | 3 +++ .../feature/preprocess/SamplerWrapper.scala | 25 ++++++++++--------- .../preprocess/StopWordsRemoverWrapper.scala | 22 +++++++++------- .../feature/preprocess/TokenizerWrapper.scala | 23 ++++++++++------- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala index 80fa773d6..2356e9ea8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala @@ -47,6 +47,9 @@ class Sampler(fraction: Double, /** @group getParam */ final def getInputCol: String = $(inputCol) + /** @group getParam */ + final def getOutputCol: String = $(inputCol) + override def transform(dataset: Dataset[_]): DataFrame = { dataset.sample(false, fraction, seed).toDF } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala index 016a807f0..dc52e14f3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala @@ -18,26 +18,27 @@ package com.tencent.angel.spark.ml.automl.feature.preprocess +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InToOutRelation +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InPlace import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer -import scala.collection.mutable.ArrayBuffer - class SamplerWrapper(fraction: Double) extends TransformerWrapper { override val transformer: Transformer = new Sampler(fraction) - override var parentTransformer: Transformer = _ - - override val requiredInputCols: Array[String] = null - override val requiredOutputCols: Array[String] = null + override var parent: TransformerWrapper = _ - override val inputCols: ArrayBuffer[String] = new ArrayBuffer[String]() - override val outputCols: ArrayBuffer[String] = new ArrayBuffer[String]() + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false - override var parentCols: Array[String] = _ + override val relation: InToOutRelation = InPlace - override def hasInputCol: Boolean = true - - override def hasOutputCol: Boolean = false + override val requiredInputCols: Array[String] = null + override val requiredOutputCols: Array[String] = null + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[Sampler].setInputCol(getInputCols(0)) + this + } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala index 19fecc442..51f2ab1ca 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -17,26 +17,30 @@ package com.tencent.angel.spark.ml.automl.feature.preprocess +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer -import scala.collection.mutable.ArrayBuffer import org.apache.spark.ml.feature.StopWordsRemover class StopWordsRemoverWrapper extends TransformerWrapper { override val transformer: Transformer = new StopWordsRemover() - override var parentTransformer: Transformer = _ + override var parent: TransformerWrapper = _ - override val requiredInputCols: Array[String] = Array("words") - override val requiredOutputCols: Array[String] = Array("filteredwords") + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false - override val inputCols: ArrayBuffer[String] = _ - override val outputCols: ArrayBuffer[String] = _ + override val relation: InToOutRelation = OneToOne - override var parentCols: Array[String] = _ + override val requiredInputCols: Array[String] = Array("words") + override val requiredOutputCols: Array[String] = Array("stopwords") - override def hasInputCol: Boolean = true + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[StopWordsRemover].setInputCol(getInputCols(0)) + transformer.asInstanceOf[StopWordsRemover].setOutputCol(getOutputCols(0)) + this + } - override def hasOutputCol: Boolean = true } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala index 63357e382..f8e88b35f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala @@ -18,26 +18,31 @@ package com.tencent.angel.spark.ml.automl.feature.preprocess +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer - -import scala.collection.mutable.ArrayBuffer import org.apache.spark.ml.feature.Tokenizer + + class TokenizerWrapper extends TransformerWrapper { override val transformer: Transformer = new Tokenizer() - override var parentTransformer: Transformer = _ + override var parent: TransformerWrapper = _ override val requiredInputCols: Array[String] = Array("sentence") override val requiredOutputCols: Array[String] = Array("words") - override val inputCols: ArrayBuffer[String] = _ - override val outputCols: ArrayBuffer[String] = _ - - override var parentCols: Array[String] = _ + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne - override def hasInputCol: Boolean = true + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[Tokenizer].setInputCol(getInputCols(0)) + transformer.asInstanceOf[Tokenizer].setOutputCol(getOutputCols(0)) + this + } - override def hasOutputCol: Boolean = true } From 3e3bccfe803ce88162ecdca846fe1612ae3dcd2b Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 17 Dec 2018 10:06:57 +0800 Subject: [PATCH 033/115] build pipeline automatically --- .../ml/automl/feature/PipelineBuilder.scala | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala index 8bddd7240..589d00173 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala @@ -18,13 +18,37 @@ package com.tencent.angel.spark.ml.automl.feature +import org.apache.spark.SparkException import org.apache.spark.ml.PipelineStage -import org.apache.spark.ml.Transformer + +import scala.collection.mutable +import scala.collection.mutable.ArrayBuffer + +class IncompatibleFiledExecption(msg: String) extends SparkException(msg) { } object PipelineBuilder { - def declareFields(pipeline: Array[PipelineStage]): Unit = { + def build(transformers: Array[TransformerWrapper]): Array[PipelineStage] = { + val stages: ArrayBuffer[PipelineStage] = new ArrayBuffer[PipelineStage]() + //val allInputCols: ArrayBuffer[String] = new ArrayBuffer[String]() + val allInputCols: mutable.HashSet[String] = new mutable.HashSet[String]() + + (1 to transformers.length).foreach { i => + // set parent + transformers(i).setParent(transformers(i - 1)) + // add new cols + allInputCols ++= transformers(i - 1).getOutputCols + // set parent cols + transformers(i).setAncestorCols(allInputCols.toArray) + // generate input cols + transformers(i).generateInputCols() + // generate output cols + transformers(i).generateOutputCols() + // add fully configured transformer + stages += transformers(i).declareInAndOut().getTransformer + } + stages.toArray } } From 39d7bdb257f8626e0733ac3d9386ee1748f80f8e Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 20 Dec 2018 15:08:05 +0800 Subject: [PATCH 034/115] covariance kernel --- .../ml/automl/tuner/kernel/CoVariance.scala | 50 ++++++++++ .../ml/automl/tuner/kernel/Matern3.scala | 91 ++++++++++++++++++ .../ml/automl/tuner/kernel/Matern5.scala | 90 ++++++++++++++++++ .../ml/automl/tuner/kernel/MaternIso5.scala | 93 +++++++++++++++++++ 4 files changed, 324 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala new file mode 100644 index 000000000..f642de644 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala @@ -0,0 +1,50 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.kernel + +import breeze.linalg.{DenseMatrix, DenseVector} + +/** + * Covariance function given two points. + */ +trait CoVariance { + + /** + * the covariance function + * @param x1 + * @param x2 + * @param params + * @return + */ + def cov(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): DenseMatrix[Double] + + /** + * the derivative of covariance function against kernel hyper-parameters + * @param x1 + * @param x2 + * @param params + * @return + */ + def grad(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): Array[DenseMatrix[Double]] + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala new file mode 100644 index 000000000..d624a43f6 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala @@ -0,0 +1,91 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.kernel + +import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.numerics.{exp, pow, sqrt} +import com.tencent.angel.spark.ml.automl.math.Distance + +/** + * Matern covariance function with v = 3/2 + * (1 + sqrt(3)*r/l) * exp(-sqrt(3)*r/l) + * Here r is the distance |x1-x2| of two points + * Hyper-parameter: l is the length scale + */ +class Matern3 extends CoVariance { + + /** + * the covariance function + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def cov(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): DenseMatrix[Double] = { + + require(params.size == 1, + s"Number of hyper parameters is ${params.length} while expected 1") + + val l = params(0) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(3) * r / l + 1.0 + val expPart = exp( -sqrt(3) * r / l ) + val covMatrix = vPart *:* expPart + // println(covMatrix) + covMatrix + } + + /** + * the derivative of covariance function against kernel hyper-parameters + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def grad(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + + require(params.size == 1, + s"Number of hyper parameters is ${params.length} while expected 1") + + val l = params(0) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(3) * r / l + 1.0 + val expPart = exp( -sqrt(3) * r / l ) + + val vPartGrad = -( sqrt(3) * r / pow(l, 2) ) *:* expPart + val expPartGrad = vPart *:* expPart *:* ( sqrt(3) * r / pow(l, 2) ) + + val gradL = vPartGrad + expPartGrad + // println(cov_l_grad) + Array(gradL) + } +} + diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala new file mode 100644 index 000000000..c1739410d --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala @@ -0,0 +1,90 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.kernel + +import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.numerics.{exp, pow, sqrt} +import com.tencent.angel.spark.ml.automl.math.Distance + +/** + * Matern covariance function with v = 5/2 + * (1 + sqrt(5)*r/l + 5r^2/(3l^2)) * exp(-sqrt(5)*r/l) + * Here r is the distance |x1-x2| of two points + * Hyper-parameter: l is the length scale + */ +class Matern5 extends CoVariance { + + /** + * the covariance function + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def cov(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): DenseMatrix[Double] = { + + require(params.size == 1, + s"Number of hyper parameters is ${params.length} while expected 1") + + val l = params(0) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 + val expPart = exp( -sqrt(5) * r / l ) + val covMatrix = vPart *:* expPart + // println(covMatrix) + covMatrix + } + + /** + * the derivative of covariance function against kernel hyper-parameters + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def grad(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + + require(params.size == 1, + s"Number of hyper parameters is ${params.length} while expected 1") + + val l = params(0) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 + val expPart = exp( -sqrt(5) * r / l ) + + val vPartGrad = -( sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3)) ) *:* expPart + val expPartGrad = vPart *:* expPart *:* ( sqrt(5) * r / pow(l, 2) ) + + val gradL = vPartGrad + expPartGrad + // println(cov_l_grad) + Array(gradL) + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala new file mode 100644 index 000000000..780b94ade --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala @@ -0,0 +1,93 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.kernel + +import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.numerics._ +import com.tencent.angel.spark.ml.automl.math.Distance + +/** + * Matern covariance function with v = 5/2 and isotropic distance measure + * theta^2 * (1 + sqrt(5)*r/l + 5r^2/(3l^2)) * exp(-sqrt(5)*r/l) + * Here r is the distance |x1-x2| of two points + * Hyper-parameter: theta is the signal variance, l is the length scale + */ +class MaternIso5 extends CoVariance { + + /** + * the covariance function + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def cov(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): DenseMatrix[Double] = { + + require(params.size == 2, + s"Number of hyper parameters is ${params.length} while expected 2") + + val l = params(0) + val theta = params(1) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 + val expPart = exp( -sqrt(5) * r / l ) + val covMatrix = pow(theta, 2) * vPart *:* expPart + // println(covMatrix) + covMatrix + } + + /** + * the derivative of covariance function against kernel hyper-parameters + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def grad(x1: DenseMatrix[Double], + x2: DenseMatrix[Double], + params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + + require(params.size == 2, + s"Number of hyper parameters is ${params.length} while expected 2") + + val l = params(0) + val theta = params(1) + + val distMat = Distance(x1, x2) + val r = sqrt(distMat) + + val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 + val expPart = exp( -sqrt(5) * r / l ) + + val vPartGrad = -( sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3)) ) *:* expPart * pow(theta, 2) + val expPartGrad = vPart *:* expPart *:* ( sqrt(5) * r / pow(l, 2) ) * pow(theta, 2) + + val gradL = vPartGrad + expPartGrad + val gradTheta = vPart *:* expPart * 2.0 * theta + // println(cov_l_grad) + Array(gradL, gradTheta) + } +} From ca9f647efc98256938a0319c070a4b9bf40555c8 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 20 Dec 2018 15:08:43 +0800 Subject: [PATCH 035/115] square distance for kernel --- .../angel/spark/ml/automl/math/Distance.scala | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala new file mode 100644 index 000000000..867ab2a86 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala @@ -0,0 +1,63 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.math + +import breeze.generic.UFunc +import breeze.linalg.{DenseMatrix,_} + + +/** + * Computes pair-wise square distances between matrices x1 and x2. + * + * @param x1 [N x D] + * @param x2 [M x D] + * @return matrix of square distances [N x M] + */ +object Distance extends UFunc { + + implicit object implSquare + extends Impl2[DenseMatrix[Double], DenseMatrix[Double], DenseMatrix[Double]] { + + def apply(x1: DenseMatrix[Double], + x2: DenseMatrix[Double]): DenseMatrix[Double] = { + + val t1 = -2.0 * (x1 * x2.t) + + val t2 = t1(*, ::) + sum(x2.t *:* x2.t, Axis._0).t + + t2(::, *) + sum(x1.t *:* x1.t, Axis._0).t + + } + } + + def main(args: Array[String]): Unit = { + + val x = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t + println(x) + var expected = DenseMatrix((0.0, 2.0, 8.0), (2.0, 0.0, 2.0), (8.0, 2.0, 0.0)) + println(Distance(x, x)) + + val x1 = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t + val x2 = DenseMatrix((7.0, 8.0), (9.0, 10.0)).t + expected = DenseMatrix((61.0, 85.0), (41.0, 61.0), (25.0, 41.0)) + println(Distance(x1, x2)) + + } + +} From 28cd24a61cef30e1e63217837854748dc1a70b82 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 20 Dec 2018 15:09:22 +0800 Subject: [PATCH 036/115] cholesky decomposition and matrix det --- .../angel/spark/ml/automl/math/BreezeOp.scala | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala new file mode 100644 index 000000000..a1c60ec5f --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala @@ -0,0 +1,48 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.math + +import breeze.linalg.DenseMatrix +import breeze.linalg.inv +import breeze.linalg.diag +import breeze.linalg.sum +import breeze.numerics.log + +object BreezeOp { + + /** + * calculate the inverse of a matrix with cholesky decomposition + * @param L: the Cholesky decomposition of matrix A where A = L'*L + * @return inv(A)=inv(L)*inv(L') + */ + def choleskyInv(L: DenseMatrix[Double]): DenseMatrix[Double] = { + val invL = inv(L) + L * L.t + } + + /** + * log determinant of positive definite matrices + * @param L + * @return + */ + def logDet(L: DenseMatrix[Double]): Double = { + 2 * sum(log(diag(L))) + } + +} From 0091f46bab706992187cee0f45bfe459b8da6b9e Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 20 Dec 2018 15:09:39 +0800 Subject: [PATCH 037/115] data parser for breeze vector --- .../spark/ml/automl/utils/DataUtils.scala | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala index cc34d666c..63ed6dd3c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala @@ -18,17 +18,19 @@ package com.tencent.angel.spark.ml.automl.utils -import org.apache.spark.ml.linalg.Vector +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector} import org.apache.spark.sql.SparkSession import org.apache.spark.sql.DataFrame import org.apache.spark.sql.types.StructType +import breeze.linalg.{DenseVector => BDV, SparseVector => BSV, Vector => BV} +import breeze.linalg.{DenseMatrix => BDM} object DataUtils { def parse(ss: SparkSession, schema: StructType, - X: List[Vector], - Y: List[Double]): DataFrame = { + X: Array[Vector], + Y: Array[Double]): DataFrame = { require(X.size == Y.size, "The size of configurations should be equal to the size of rewards.") ss.createDataFrame( @@ -38,7 +40,26 @@ object DataUtils { def parse(ss: SparkSession, schema: StructType, X: Vector): DataFrame = { - parse(ss, schema, List(X), List(0)) + parse(ss, schema, Array(X), Array(0)) + } + + def toBreeze(values: Array[Double]): BV[Double] = { + new BDV[Double](values) + } + + def toBreeze(vector: Vector): BV[Double] = vector match { + case sv: SparseVector => new BSV[Double](sv.indices, sv.values, sv.size) + case dv: DenseVector => new BDV[Double](dv.values) + } + + def toBreeze(X: Array[Vector]): BDM[Double] = { + val mat = BDM.zeros[Double](X.size, X(0).size) + for (i <- 0 until X.size) { + for (j <- 0 until X(0).size) { + mat(i, j) = X(i)(j) + } + } + mat } } From 551e7375f88d0c4f934e017fcd0e2f19728892a7 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 20 Dec 2018 15:10:12 +0800 Subject: [PATCH 038/115] use array instead of list --- .../angel/spark/ml/automl/tuner/Example.scala | 4 ++-- .../acquisition/optimizer/AcqOptimizer.scala | 2 +- .../acquisition/optimizer/LocalSearch.scala | 2 +- .../acquisition/optimizer/RandomSearch.scala | 20 ++++++++++++------- .../tuner/config/ConfigurationSpace.scala | 12 +++++------ .../tuner/parameter/ContinuousSpace.scala | 16 +++++++-------- .../tuner/parameter/DiscreteSpace.scala | 15 ++++++++------ .../automl/tuner/parameter/ParamSpace.scala | 4 ++-- .../spark/ml/automl/tuner/solver/Solver.scala | 6 +++--- .../automl/tuner/solver/SolverWithTrail.scala | 8 ++++---- .../automl/tuner/surrogate/RFSurrogate.scala | 8 ++------ .../ml/automl/tuner/surrogate/Surrogate.scala | 10 +++++----- .../spark/ml/automl/tuner/trail/Trail.scala | 2 +- 13 files changed, 57 insertions(+), 52 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala index 490719893..106d09e9e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala @@ -32,8 +32,8 @@ object Example extends App { override def main(args: Array[String]): Unit = { val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", List(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", List(-5.0, -3.0, 0.0, 3.0, 5.0)) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val cs: ConfigurationSpace = new ConfigurationSpace("cs") cs.addParam(param1) cs.addParam(param2) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index d3aa365ba..6ba321d3a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -36,7 +36,7 @@ abstract class AcqOptimizer( * @param numPoints : Number of queried points. * @return A set of tuple(acquisition value, Configuration). */ - def maximize(numPoints: Int, sorted: Boolean = true): List[(Double, Configuration)] + def maximize(numPoints: Int, sorted: Boolean = true): Array[(Double, Configuration)] def maximize: (Double, Configuration) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala index 7bf2fe956..c3ea21589 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -43,7 +43,7 @@ class LocalSearch( * @return A set of tuple(acquisition_value, Configuration). */ override def maximize(numPoints: Int, - sorted: Boolean = true): List[(Double, Configuration)] = ??? + sorted: Boolean = true): Array[(Double, Configuration)] = ??? override def maximize: (Double, Configuration) = ??? } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index 1fd822841..3ba3b7a00 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -41,14 +41,20 @@ class RandomSearch( val rd = new Random(seed) - override def maximize(numPoints: Int, sorted: Boolean = true): List[(Double, Configuration)] = { + override def maximize(numPoints: Int, sorted: Boolean = true): Array[(Double, Configuration)] = { //println(s"maximize RandomSearch") - val configs: List[Configuration] = configSpace.sampleConfig(TunerParam.sampleSize) - configs.foreach( config => println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}")) - if (sorted) - configs.map{config => (acqFunc.compute(config.getVector)._1, config)}.sortWith(_._1 > _._1).take(numPoints) - else - rd.shuffle(configs.map{config => (0.0, config)}).take(numPoints) + val configs: Array[Configuration] = configSpace.sampleConfig(TunerParam.sampleSize) + configs.foreach( + config => println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") + ) + if (sorted) { + configs.map { + config => (acqFunc.compute(config.getVector)._1, config) + }.sortWith(_._1 > _._1).take(numPoints) + } + else { + rd.shuffle(configs.map{ config => (0.0, config) }.toTraversable).take(numPoints).toArray + } } override def maximize: (Double, Configuration) = { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index 8620180f1..d7dc65194 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -57,7 +57,7 @@ class ConfigurationSpace( def getFields: Array[StructField] = fields.toArray - def getParams: List[ParamSpace[Double]] = paramDict.values.toList + def getParams(): Array[ParamSpace[Double]] = paramDict.values.toArray def getParamByName(name: String): Option[ParamSpace[Double]] = paramDict.get(name) @@ -66,18 +66,18 @@ class ConfigurationSpace( def getParamByIdx(idx: Int): Option[ParamSpace[Double]] = paramDict.get(idx2Param.getOrElse(idx, "none")) // TODO: Store historical configurations to avoid redundancy. - def sampleConfig(size: Int): List[Configuration] = { - var configs: ListBuffer[Configuration] = new ListBuffer[Configuration] + def sampleConfig(size: Int): Array[Configuration] = { + var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var missing: Int = 0 do { missing = size - configs.length println(s"num of params: $numParams") - var vectors: List[Vector] = List.fill(missing)(Vectors.dense(new Array[Double](numParams))) + var vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) param2Idx.foreach { case (paramName, paramIdx) => paramDict.get(paramName) match { case Some(param) => - param.sample(missing).zipWithIndex.foreach { case (f,i) => + param.sample(missing).zipWithIndex.foreach { case (f: Double, i: Int) => vectors(i).toArray(paramIdx) = f } case None => LOG.info(s"Cannot find $paramName.") @@ -88,7 +88,7 @@ class ConfigurationSpace( } } while(configs.length < size) - configs.toList + configs.toArray } // TODO: Implement this func diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index b94975213..1dca71396 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -20,7 +20,7 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter import com.tencent.angel.spark.ml.automl.utils.Distribution -import scala.collection.mutable.ListBuffer +import scala.collection.mutable.ArrayBuffer import scala.util.Random /** @@ -40,10 +40,10 @@ class ContinuousSpace( seed: Int = 100) extends ParamSpace[Double](name) { val rd = new Random(seed) - val values: List[Double] = calValues + val values: Array[Double] = calValues - def calValues(): List[Double] = { - var ret: ListBuffer[Double] = ListBuffer[Double]() + def calValues(): Array[Double] = { + var ret: ArrayBuffer[Double] = ArrayBuffer[Double]() distribution match { case Distribution.LINEAR => val interval: Double = (upper - lower) / (num - 1) @@ -53,14 +53,14 @@ class ContinuousSpace( case _ => println(s"Distribution $distribution not supported") } - ret.toList + ret.toArray } def getLower: Double = lower def getUpper: Double = upper - def getValues: List[Double] = values + def getValues: Array[Double] = values def numValues: Int = num @@ -68,9 +68,9 @@ class ContinuousSpace( def toRandomSpace: ParamSpace[Double] = this - override def sample(size: Int): List[Double] = List.fill(size)(sample) + override def sample(size: Int): Array[Double] = Array.fill[Double](size)(sampleOne) - override def sample: Double = values(rd.nextInt(numValues)) + def sampleOne(): Double = values(rd.nextInt(numValues)) override def toString: String = s"ContinuousSpace[$name]: (${values mkString(",")})" diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala index 32ed2318f..ab322f56f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -18,6 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter +import scala.reflect.ClassTag import scala.util.Random /** @@ -26,14 +27,14 @@ import scala.util.Random * @param name: Name of the parameter * @param values: List of all possible values */ -class DiscreteSpace[T: Numeric]( +class DiscreteSpace[T: Numeric: ClassTag]( override val name: String, - values: List[T], + values: Array[T], seed: Int = 100) extends ParamSpace[T](name) { val rd = new Random(seed) - def getValues: List[T] = values + def getValues: Array[T] = values def numValues: Int = values.length @@ -41,9 +42,11 @@ class DiscreteSpace[T: Numeric]( def toRandomSpace: ParamSpace[T] = this - override def sample(size: Int): List[T] = List.fill(size)(sample) + def sample(size: Int): Array[T] = { + Array.fill[T](size)(sampleOne) + } - override def sample: T = values(rd.nextInt(numValues)) + def sampleOne(): T = values(rd.nextInt(numValues)) override def toString: String = s"DiscreteSpace[$name]: (${values mkString(",")})" } @@ -51,7 +54,7 @@ class DiscreteSpace[T: Numeric]( object DiscreteSpace { def main(args: Array[String]): Unit = { - val obj = new DiscreteSpace[Float]("test", List(1.0f, 2.0f, 3.0f, 4.0f, 5.0f)) + val obj = new DiscreteSpace[Float]("test", Array(1.0f, 2.0f, 3.0f, 4.0f, 5.0f)) println(obj.toString) println(obj.sample(2).toString()) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala index 55ab25e40..d634b89f3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -25,8 +25,8 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter */ abstract class ParamSpace[T: Numeric](val name: String) { - def sample(size: Int): List[T] + def sample(size: Int): Array[T] - def sample: T + def sampleOne(): T } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 4ad8f67c2..49889344d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -34,14 +34,14 @@ class Solver( val LOG: Log = LogFactory.getLog(classOf[Solver]) - def getObservations: (List[Vector], List[Double]) = (surrogate.curX.toList, surrogate.curY.toList) + def getObservations(): (Array[Vector], Array[Double]) = (surrogate.curX.toArray, surrogate.curY.toArray) def getSurrogate: Surrogate = surrogate /** * Suggests configurations to evaluate. */ - def suggest(): List[Configuration] = { + def suggest(): Array[Configuration] = { //println(s"suggest configurations") optimizer.maximize(TunerParam.batchSize).map(_._2) } @@ -51,7 +51,7 @@ class Solver( * @param configs: More evaluated configurations * @param Y: More evaluation result */ - def feed(configs: List[Configuration], Y: List[Double]): Unit = { + def feed(configs: Array[Configuration], Y: Array[Double]): Unit = { //println(s"feed ${configs.size} configurations") surrogate.update(configs.map(_.getVector), Y) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala index da8898a0d..976f36fcc 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala @@ -32,13 +32,13 @@ class SolverWithTrail(val solver: Solver, val trail: Trail) { * @param Y : Initial function values of the already evaluated points * @return Incumbent and function value of the incumbent */ - def run(numIter: Int, X: List[Configuration] = Nil, Y: List[Double] = Nil): (Vector, Double) = { - if (X != Nil && Y != Nil && X.size == Y.size) + def run(numIter: Int, X: Array[Configuration] = null, Y: Array[Double] = null): (Vector, Double) = { + if (X != null && Y != null && X.size == Y.size) solver.feed(X, Y) (0 until numIter).foreach{ iter => println(s"------iteration $iter starts------") - val configs: List[Configuration] = solver.suggest - val results: List[Double] = trail.evaluate(configs) + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) } solver.surrogate.curBest diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 00b02e10d..37917fe99 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -24,7 +24,6 @@ import com.tencent.angel.spark.ml.automl.utils.DataUtils import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.ml.regression.{DecisionTreeRegressionModel, RandomForestRegressionModel, RandomForestRegressor} import org.apache.spark.sql.{DataFrame, SparkSession} -import org.apache.spark.{SparkConf, SparkContext} class RFSurrogate( override val cs: ConfigurationSpace, @@ -36,9 +35,7 @@ class RFSurrogate( var model: RandomForestRegressionModel = _ val numTrees: Int = 5 val maxDepth: Int = 2 - //val conf = new SparkConf().setMaster("local").setAppName("RandomForest") - //val sc = new SparkContext(conf) - //sc.setLogLevel("ERROR") + val ss = SparkSession.builder() .master("local") .appName("test") @@ -49,7 +46,7 @@ class RFSurrogate( if (curX.size < Math.pow(2, maxDepth - 1)) return - val data: DataFrame = DataUtils.parse(ss, schema, curX.toList, curY.toList) + val data: DataFrame = DataUtils.parse(ss, schema, curX.toArray, curY.toArray) val rf = new RandomForestRegressor() @@ -59,7 +56,6 @@ class RFSurrogate( .setMaxDepth(maxDepth) model = rf.fit(data) - } /** diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index 80c920981..035b950d1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -45,9 +45,9 @@ abstract class Surrogate( val LOG: Log = LogFactory.getLog(classOf[Surrogate]) // Input data points, (N, D) - var curX: ListBuffer[Vector] = new ListBuffer[Vector]() + var curX: ArrayBuffer[Vector] = new ArrayBuffer[Vector]() // Target value, (N, ) - var curY: ListBuffer[Double] = new ListBuffer[Double]() + var curY: ArrayBuffer[Double] = new ArrayBuffer[Double]() /** * Train the surrogate on curX and curY. @@ -60,7 +60,7 @@ abstract class Surrogate( * @param X : (N, D), input data points. * @param Y : (N, 1), the corresponding target values. */ - def train(X: List[Vector], Y: List[Double]): Unit = { + def train(X: Array[Vector], Y: Array[Double]): Unit = { curX.clear curY.clear curX ++ X @@ -74,7 +74,7 @@ abstract class Surrogate( * @param X * @param Y */ - def update(X: List[Vector], Y: List[Double]): Unit = { + def update(X: Array[Vector], Y: Array[Double]): Unit = { X.zip(Y).foreach( tuple => print(tuple._1, tuple._2) ) curX ++= X curY ++= Y @@ -98,7 +98,7 @@ abstract class Surrogate( * @param X * @return tuples of (mean, variance) */ - def predict(X: List[Vector]): List[(Double, Double)] = { + def predict(X: Array[Vector]): Array[(Double, Double)] = { X.map(predict) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala index a207ad8cd..a1d291a32 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala @@ -22,7 +22,7 @@ import com.tencent.angel.spark.ml.automl.tuner.config.Configuration abstract class Trail { - def evaluate(configs: List[Configuration]): List[Double] = configs.map(evaluate) + def evaluate(configs: Array[Configuration]): Array[Double] = configs.map(evaluate) def evaluate(config: Configuration): Double From 4bcc63a6b9485bcb11694465cf9648e4698ae64b Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 22 Dec 2018 23:40:45 +0800 Subject: [PATCH 039/115] bug fix of covariance function --- .../ml/automl/tuner/kernel/Matern3.scala | 26 +++++++------- .../ml/automl/tuner/kernel/Matern5.scala | 28 +++++++-------- .../{MaternIso5.scala => Matern5Iso.scala} | 34 +++++++++---------- 3 files changed, 44 insertions(+), 44 deletions(-) rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/{MaternIso5.scala => Matern5Iso.scala} (75%) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala index d624a43f6..6b9a0a515 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala @@ -18,9 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner.kernel -import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.numerics.{exp, pow, sqrt} -import com.tencent.angel.spark.ml.automl.math.Distance +import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist /** * Matern covariance function with v = 3/2 @@ -28,7 +28,7 @@ import com.tencent.angel.spark.ml.automl.math.Distance * Here r is the distance |x1-x2| of two points * Hyper-parameter: l is the length scale */ -class Matern3 extends CoVariance { +case class Matern3() extends Covariance { /** * the covariance function @@ -38,22 +38,22 @@ class Matern3 extends CoVariance { * @param params * @return */ - override def cov(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): DenseMatrix[Double] = { + override def cov(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): BDM[Double] = { require(params.size == 1, s"Number of hyper parameters is ${params.length} while expected 1") val l = params(0) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) val vPart = sqrt(3) * r / l + 1.0 val expPart = exp( -sqrt(3) * r / l ) val covMatrix = vPart *:* expPart - // println(covMatrix) + covMatrix } @@ -65,16 +65,16 @@ class Matern3 extends CoVariance { * @param params * @return */ - override def grad(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + override def grad(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): Array[BDM[Double]] = { require(params.size == 1, s"Number of hyper parameters is ${params.length} while expected 1") val l = params(0) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) val vPart = sqrt(3) * r / l + 1.0 @@ -84,7 +84,7 @@ class Matern3 extends CoVariance { val expPartGrad = vPart *:* expPart *:* ( sqrt(3) * r / pow(l, 2) ) val gradL = vPartGrad + expPartGrad - // println(cov_l_grad) + Array(gradL) } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala index c1739410d..d74da88e6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala @@ -18,9 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner.kernel -import breeze.linalg.{DenseMatrix, DenseVector} -import breeze.numerics.{exp, pow, sqrt} -import com.tencent.angel.spark.ml.automl.math.Distance +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} +import breeze.numerics._ +import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist /** * Matern covariance function with v = 5/2 @@ -28,7 +28,7 @@ import com.tencent.angel.spark.ml.automl.math.Distance * Here r is the distance |x1-x2| of two points * Hyper-parameter: l is the length scale */ -class Matern5 extends CoVariance { +case class Matern5() extends Covariance { /** * the covariance function @@ -38,22 +38,22 @@ class Matern5 extends CoVariance { * @param params * @return */ - override def cov(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): DenseMatrix[Double] = { + override def cov(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): BDM[Double] = { require(params.size == 1, s"Number of hyper parameters is ${params.length} while expected 1") val l = params(0) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 val expPart = exp( -sqrt(5) * r / l ) val covMatrix = vPart *:* expPart - // println(covMatrix) + covMatrix } @@ -65,16 +65,16 @@ class Matern5 extends CoVariance { * @param params * @return */ - override def grad(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + override def grad(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): Array[BDM[Double]] = { require(params.size == 1, s"Number of hyper parameters is ${params.length} while expected 1") val l = params(0) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 @@ -84,7 +84,7 @@ class Matern5 extends CoVariance { val expPartGrad = vPart *:* expPart *:* ( sqrt(5) * r / pow(l, 2) ) val gradL = vPartGrad + expPartGrad - // println(cov_l_grad) + Array(gradL) } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala similarity index 75% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala index 780b94ade..565c3ac46 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/MaternIso5.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala @@ -18,9 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner.kernel -import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.numerics._ -import com.tencent.angel.spark.ml.automl.math.Distance +import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist /** * Matern covariance function with v = 5/2 and isotropic distance measure @@ -28,7 +28,7 @@ import com.tencent.angel.spark.ml.automl.math.Distance * Here r is the distance |x1-x2| of two points * Hyper-parameter: theta is the signal variance, l is the length scale */ -class MaternIso5 extends CoVariance { +case class Matern5Iso() extends Covariance { /** * the covariance function @@ -38,20 +38,20 @@ class MaternIso5 extends CoVariance { * @param params * @return */ - override def cov(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): DenseMatrix[Double] = { + override def cov(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): BDM[Double] = { require(params.size == 2, s"Number of hyper parameters is ${params.length} while expected 2") - val l = params(0) - val theta = params(1) + val theta = params(0) + val l = params(1) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) - val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 + val vPart = (sqrt(5) * r) / l + distMat / pow(l, 2) * 5.0 / 3.0 + 1.0 val expPart = exp( -sqrt(5) * r / l ) val covMatrix = pow(theta, 2) * vPart *:* expPart // println(covMatrix) @@ -66,17 +66,17 @@ class MaternIso5 extends CoVariance { * @param params * @return */ - override def grad(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): Array[DenseMatrix[Double]] = { + override def grad(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): Array[BDM[Double]] = { require(params.size == 2, s"Number of hyper parameters is ${params.length} while expected 2") - val l = params(0) - val theta = params(1) + val theta = params(0) + val l = params(1) - val distMat = Distance(x1, x2) + val distMat = SquareDist(x1, x2) val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 @@ -88,6 +88,6 @@ class MaternIso5 extends CoVariance { val gradL = vPartGrad + expPartGrad val gradTheta = vPart *:* expPart * 2.0 * theta // println(cov_l_grad) - Array(gradL, gradTheta) + Array(gradTheta, gradL) } } From 00450526184bf3da853eac230bcb554975d87ed5 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 22 Dec 2018 23:41:14 +0800 Subject: [PATCH 040/115] new covariance function: square exp --- .../ml/automl/tuner/kernel/SquareExpIso.scala | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala new file mode 100644 index 000000000..58b3a7971 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala @@ -0,0 +1,69 @@ +package com.tencent.angel.spark.ml.automl.tuner.kernel + +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} +import breeze.numerics._ +import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist + +/** + * Square exponential covariance function with isotropic distance measure + * k(x1, x2) = theta^2 * exp( -(x1-x2)^2 / l^2 ) + * Hyper-parameter: theta is the signal variance, l is the length scale + **/ +case class SquareExpIso() extends Covariance { + + /** + * the covariance function + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def cov(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): BDM[Double] = { + + require(params.size == 2, + s"Number of hyper parameters is ${params.length} while expected 2") + + val theta = params(0) + val l = params(1) + + val distMat = SquareDist(x1, x2) + + val covMatrix = pow(theta,2) * exp(-0.5 * distMat/ pow(l, 2)) + + covMatrix + } + + /** + * the derivative of covariance function against kernel hyper-parameters + * + * @param x1 + * @param x2 + * @param params + * @return + */ + override def grad(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): Array[BDM[Double]] = { + + require(params.size == 2, + s"Number of hyper parameters is ${params.length} while expected 2") + + val theta = params(0) + val l = params(1) + + val distMat = SquareDist(x1, x2) + val r = sqrt(distMat) + + val expDistMat = exp(-0.5 * distMat / pow(l, 2)) + + val gradTheta = 2 * theta * expDistMat + + val gradL = pow(theta, 2) * expDistMat *:* distMat / pow(l, 3) + + Array(gradTheta, gradL) + } +} + From d2f8445ea2393ded5e652a54197bb967f97fa00d Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 22 Dec 2018 23:43:10 +0800 Subject: [PATCH 041/115] covar type, log likelihood, kernel diff function --- .../spark/ml/automl/tuner/GPExample.scala | 51 ++++++++++++ .../ml/automl/tuner/kernel/CoVariance.scala | 16 ++-- .../kernel/CovarianceType.scala} | 45 +++++----- .../spark/ml/automl/tuner/math/BreezeOp.scala | 79 ++++++++++++++++++ .../math/SquareDist.scala} | 31 ++----- .../automl/tuner/model/GPKernelDiffFunc.scala | 82 +++++++++++++++++++ 6 files changed, 247 insertions(+), 57 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/{math/BreezeOp.scala => tuner/kernel/CovarianceType.scala} (53%) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/{math/Distance.scala => tuner/math/SquareDist.scala} (58%) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala new file mode 100644 index 000000000..e95f7d863 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala @@ -0,0 +1,51 @@ +package com.tencent.angel.spark.ml.automl.tuner + +import breeze.linalg._ +import breeze.numerics._ +import com.tencent.angel.spark.ml.automl.tuner.kernel.{Matern5Iso, SquareExpIso} +import com.tencent.angel.spark.ml.automl.tuner.model.GPModel + +object GPExample { + + def main(args: Array[String]): Unit = { + + val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) + val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t + val truePredZ = 2.0 * DenseVector(2.5,4.5,6.5,8.5,10.0,12.0) + + // //2.Test no_linear(y=cos(x)+1) + // val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + // val y = cos(DenseVector(1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0))+1.0 + // val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + // val truePredZ = cos(DenseVector(2.5, 4.5,6.5,8.5,10.0,12.0))+1.0 + + // //3.Test no_linear(y=x^2) + // val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + // val y = DenseVector(1.0,4.0, 9.0,16.0,25.0,36.0,49.0,64.0,81.0) + // val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + // val truePredZ = pow(z,2) + + //val covFunc = SquareExpIso() + val covFunc = Matern5Iso() + val initCovParams = DenseVector(1.0,1.0) + val initNoiseStdDev = 0.1 + + val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) + + gpModel.fit(X, y) + + println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n") + + val prediction = gpModel.predict(z) + println("Mean and Var:") + println(prediction) + println("True value:") + println(truePredZ) + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala index f642de644..633011877 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala @@ -18,12 +18,12 @@ package com.tencent.angel.spark.ml.automl.tuner.kernel -import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} /** * Covariance function given two points. */ -trait CoVariance { +trait Covariance { /** * the covariance function @@ -32,9 +32,9 @@ trait CoVariance { * @param params * @return */ - def cov(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): DenseMatrix[Double] + def cov(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): BDM[Double] /** * the derivative of covariance function against kernel hyper-parameters @@ -43,8 +43,8 @@ trait CoVariance { * @param params * @return */ - def grad(x1: DenseMatrix[Double], - x2: DenseMatrix[Double], - params: DenseVector[Double]): Array[DenseMatrix[Double]] + def grad(x1: BDM[Double], + x2: BDM[Double], + params: BDV[Double]): Array[BDM[Double]] } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala similarity index 53% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala index a1c60ec5f..29191acd4 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/BreezeOp.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala @@ -16,33 +16,28 @@ */ -package com.tencent.angel.spark.ml.automl.math - -import breeze.linalg.DenseMatrix -import breeze.linalg.inv -import breeze.linalg.diag -import breeze.linalg.sum -import breeze.numerics.log - -object BreezeOp { - - /** - * calculate the inverse of a matrix with cholesky decomposition - * @param L: the Cholesky decomposition of matrix A where A = L'*L - * @return inv(A)=inv(L)*inv(L') - */ - def choleskyInv(L: DenseMatrix[Double]): DenseMatrix[Double] = { - val invL = inv(L) - L * L.t +package com.tencent.angel.spark.ml.automl.tuner.kernel + +object CovarianceType extends Enumeration { + + type CovarianceType = Value + + val MATERN3 = Value("MATERN3") + val MATERN5 = Value("MATERN5") + val MATERN5_ISO = Value("MATERN5_ISO") + val SQUAREEXP_ISO = Value("SQUAREEXP_ISO") + + def parse(name: String): Covariance = { + val covType = CovarianceType.withName(name.toUpperCase()) + parse(covType) } - /** - * log determinant of positive definite matrices - * @param L - * @return - */ - def logDet(L: DenseMatrix[Double]): Double = { - 2 * sum(log(diag(L))) + def parse(covType: CovarianceType.Value): Covariance = covType match { + case MATERN3 => new Matern3 + case MATERN5 => new Matern5 + case MATERN5_ISO => new Matern5Iso + case SQUAREEXP_ISO => new SquareExpIso + case _ => new Matern5 } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala new file mode 100644 index 000000000..668642638 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala @@ -0,0 +1,79 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.math + +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} +import breeze.linalg.{cholesky, diag, inv, sum, trace} +import breeze.numerics.log + +import scala.math.Pi + +object BreezeOp { + + /** + * calculate the inverse of a matrix with cholesky decomposition + * + * @param L : the Cholesky decomposition of matrix A where A = L'*L + * @return inv(A)=inv(L)*inv(L') + */ + def choleskyInv(L: BDM[Double]): BDM[Double] = { + val invL = inv(L) + invL * invL.t + } + + /** + * sum of log diag of positive definite matrices + * + * @param L + * @return + */ + def sumLogDiag(L: BDM[Double]): Double = { + 2 * sum(log(diag(L))) + } + + def logLike(meanX: BDV[Double], + KXX: BDM[Double], + invKXX: BDM[Double], + y: BDV[Double]): Double = { + + val m = meanX + + val logDiag = sumLogDiag(cholesky(KXX)) + + val value = -0.5 * (y - m).t * invKXX * (y - m) - 0.5 * logDiag - 0.5 * meanX.size * scala.math.log(2 * Pi) + + value(0) + } + + def logLikeD(meanX: BDV[Double], + invKXX: BDM[Double], + y: BDV[Double], + covGrads: Array[BDM[Double]]): BDV[Double] = { + + val m = meanX + val alpha = invKXX * (y - m) + + val grads = covGrads.map { covGrad => + val tmp = alpha * alpha.t - invKXX + 0.5 * trace(tmp * covGrad) + } + + BDV(grads) + } +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala similarity index 58% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala index 867ab2a86..24fd56c4c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/math/Distance.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala @@ -16,11 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.math +package com.tencent.angel.spark.ml.automl.tuner.math import breeze.generic.UFunc -import breeze.linalg.{DenseMatrix,_} - +import breeze.linalg.{DenseMatrix => BDM, _} /** * Computes pair-wise square distances between matrices x1 and x2. @@ -29,35 +28,19 @@ import breeze.linalg.{DenseMatrix,_} * @param x2 [M x D] * @return matrix of square distances [N x M] */ -object Distance extends UFunc { +object SquareDist extends UFunc { - implicit object implSquare - extends Impl2[DenseMatrix[Double], DenseMatrix[Double], DenseMatrix[Double]] { + implicit object implBinary + extends Impl2[BDM[Double], BDM[Double], BDM[Double]] { - def apply(x1: DenseMatrix[Double], - x2: DenseMatrix[Double]): DenseMatrix[Double] = { + def apply(x1: BDM[Double], + x2: BDM[Double]): BDM[Double] = { val t1 = -2.0 * (x1 * x2.t) val t2 = t1(*, ::) + sum(x2.t *:* x2.t, Axis._0).t t2(::, *) + sum(x1.t *:* x1.t, Axis._0).t - } } - - def main(args: Array[String]): Unit = { - - val x = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t - println(x) - var expected = DenseMatrix((0.0, 2.0, 8.0), (2.0, 0.0, 2.0), (8.0, 2.0, 0.0)) - println(Distance(x, x)) - - val x1 = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t - val x2 = DenseMatrix((7.0, 8.0), (9.0, 10.0)).t - expected = DenseMatrix((61.0, 85.0), (41.0, 61.0), (25.0, 41.0)) - println(Distance(x1, x2)) - - } - } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala new file mode 100644 index 000000000..c6d8b1b01 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala @@ -0,0 +1,82 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.model + +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV, MatrixNotSymmetricException, NotConvergedException} +import breeze.optimize.DiffFunction +import com.tencent.angel.spark.ml.automl.tuner.math.BreezeOp + +class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { + + var iter: Int = _ + + override def calculate(params: BDV[Double]): (Double, BDV[Double]) = { + + try { + println(s"------iteration $iter------") + val covParams = BDV(params.toArray.dropRight(1)) + model.covParams = covParams + val noiseStdDev = params.toArray.last + model.noiseStdDev = noiseStdDev + println(s"covariance params: $covParams") + println(s"standard derivative: $noiseStdDev") + + val meanX = model.meanFunc(model.X) + val KXX = model.calKXX() + + //println(s"meanX: $meanX") + //println(s"KXX: $KXX") + + val invKXX = model.calInvKXX(KXX) + //println("inverse of KXX:") + //println(invKXX) + + //println("true inverse of KXX:") + //println(inv(KXX)) + + val loglikeLoss = - BreezeOp.logLike(meanX, KXX, invKXX, model.y) + println(s"log likelihood loss: $loglikeLoss") + + // calculate partial derivatives + val covarFuncGrads = model.covFunc.grad(model.X, model.X, covParams) + //println("covariance grads:") + //covarFuncGrads.foreach(println) + + val covarNoiseGrad = 2 * noiseStdDev * BDM.eye[Double](model.X.rows) + //println("covariance noise grads:") + //println(covarNoiseGrad) + + val allGrads = covarFuncGrads :+ covarNoiseGrad + + val loglikeGrads = BreezeOp.logLikeD(meanX, invKXX, model.y, allGrads).map(d => -d) + println(s"grad of covariance params: $loglikeGrads") + + iter = iter + 1 + + (loglikeLoss, loglikeGrads) + } catch { + case e: NotConvergedException => + println(s"not converge exception $e") + (Double.NaN, BDV.zeros[Double](params.size) * Double.NaN) + case e: MatrixNotSymmetricException => + println(s"matrix not symmetric exception $e") + (Double.NaN, BDV.zeros[Double](params.size) * Double.NaN) + } + } +} From 5e249b9e5cf7d74ad50708c7df34e03e9f0821ab Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 22 Dec 2018 23:43:31 +0800 Subject: [PATCH 042/115] GP model and surrogate --- .../spark/ml/automl/tuner/model/GPModel.scala | 135 ++++++++++++++++++ .../automl/tuner/surrogate/GPSurrogate.scala | 53 +++++++ 2 files changed, 188 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala new file mode 100644 index 000000000..095d45d11 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala @@ -0,0 +1,135 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.model + +import breeze.linalg.{cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} +import breeze.optimize.LBFGS +import com.tencent.angel.spark.ml.automl.tuner.kernel.{Covariance, CovarianceType} +import com.tencent.angel.spark.ml.automl.tuner.math.BreezeOp + +import scala.math._ + +class GPModel(val covFunc: Covariance, + var covParams: BDV[Double], + var noiseStdDev: Double, + val meanFunc: (BDM[Double]) => BDV[Double]) { + + var X: BDM[Double] = _ + var y: BDV[Double] = _ + var KXX: BDM[Double] = _ + var L: BDM[Double] = _ + + def fit(newX: BDM[Double], + newy: BDV[Double]): this.type = { + require(newX.rows == newy.length, "incompatible size of the input X and y") + + if ( (X == null && y == null) || + (newX.rows > X.rows && newy.length > y.length) ) { + X = newX + y = newy + } + + val kernelDiffFunc = new GPKernelDiffFunc(this) + val initParams = BDV(covParams.toArray :+ noiseStdDev) + + val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 3, tolerance = 1e-7) + val newParams = optimizer.minimize(kernelDiffFunc, initParams) + println(optimizer) + println(s"new params: ${newParams}") + + val newCovParams = BDV(newParams.toArray.dropRight(1)) + val newNoiseStdDev = newParams.toArray.last + + this.covParams = newCovParams + this.noiseStdDev = newNoiseStdDev + + this + } + + def update(newX: BDM[Double], + newy: BDV[Double]): this.type = { + this + } + + def predict(newX: BDM[Double]): BDM[Double] = { + val meanX = meanFunc(X) + + val KXX = calKXX() + + val invKXX = calInvKXX(KXX) + + val KXZ = covFunc.cov(X, newX, covParams) + + val KZZ = covFunc.cov(newX, newX, covParams) + + val meanNewX = meanFunc(newX) + + val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) + val predVar = KZZ - KXZ.t * invKXX * KXZ + + BDV.horzcat(predMean, diag(predVar)) + } + + def calKXX(): BDM[Double] = { + val KXX = covFunc.cov(X, X, covParams) + + pow(noiseStdDev, 2) * BDM.eye[Double](X.rows) + + BDM.eye[Double](X.rows) * 1e-7 + + KXX + } + + def calInvKXX(KXX: BDM[Double]): BDM[Double] = { + val l = cholesky(KXX) + val invKXX = BreezeOp.choleskyInv(l.t) + + invKXX + } +} + +object GPModel { + + def apply(covFunc: Covariance, + covParams: BDV[Double], + noiseStdDev: Double, + meanFunc: (BDM[Double]) => BDV[Double]): GPModel = { + new GPModel(covFunc, covParams, noiseStdDev, meanFunc) + } + + def apply(covFunc: Covariance, + covParams: BDV[Double], + noiseStdDev: Double, + mean: Double = 0.0): GPModel = { + val meanFunc = (x: BDM[Double]) => BDV.zeros[Double](x.rows) + mean + new GPModel(covFunc, covParams, noiseStdDev, meanFunc) + } + + def apply(covName: String, + covParams: BDV[Double], + noiseStdDev: Double, + meanFunc: (BDM[Double]) => BDV[Double]): GPModel = { + new GPModel(CovarianceType.parse(covName), covParams, noiseStdDev, meanFunc) + } + + def apply(covType: CovarianceType.Value, + covParams: BDV[Double], + noiseStdDev: Double, + meanFunc: (BDM[Double]) => BDV[Double]): GPModel = { + new GPModel(CovarianceType.parse(covType), covParams, noiseStdDev, meanFunc) + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala new file mode 100644 index 000000000..d8b5a5ebc --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala @@ -0,0 +1,53 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner.surrogate + +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import org.apache.spark.ml.linalg.{DenseMatrix, Vector} +import com.tencent.angel.spark.ml.automl.utils.DataUtils +import org.apache.commons.logging.{Log, LogFactory} + +class GPSurrogate( + override val cs: ConfigurationSpace, + override val minimize: Boolean = true) + extends Surrogate(cs, minimize) { + + override val LOG: Log = LogFactory.getLog(classOf[RFSurrogate]) + + + /** + * Train the surrogate on curX and curY. + */ + override def train(): Unit = { + + val breezeX = DataUtils.toBreeze(curX.toArray) + val breezeY = DataUtils.toBreeze(curY.toArray) + + } + + /** + * Predict means and variances for a single given X. + * + * @param X + * @return a tuple of (mean, variance) + */ + override def predict(X: Vector): (Double, Double) = ??? + + override def stop(): Unit = ??? +} From 36ded18abc79ad394f57bed5ecc6a658d0fb93ac Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 22 Dec 2018 23:45:41 +0800 Subject: [PATCH 043/115] UT of dist function --- .../angel/spark/ml/math/SquareDistTest.scala | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala new file mode 100644 index 000000000..590246068 --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala @@ -0,0 +1,59 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.math + +import breeze.linalg.{DenseMatrix, DenseVector} +import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import org.junit.Assert._ +import org.junit._ + +class SquareDistTest { + + @Test def testXX1D = { + + val x = DenseVector(1.0, 2.0, 3.0).toDenseMatrix.t + val expected = DenseMatrix((0.0, 1.0, 4.0), (1.0, 0.0, 1.0), (4.0, 1.0, 0.0)) + assertEquals(expected, SquareDist(x, x)) + } + + @Test def testXX2D = { + + val x = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t + val expected = DenseMatrix((0.0, 2.0, 8.0), (2.0, 0.0, 2.0), (8.0, 2.0, 0.0)) + assertEquals(expected, SquareDist(x, x)) + } + + @Test def testXY1D = { + + val x1 = DenseVector(1.0, 2.0, 3.0).toDenseMatrix.t + val x2 = DenseVector(4.0, 5.0).toDenseMatrix.t + + val expected = DenseMatrix((9.0, 16.0), (4.0, 9.0), (1.0, 4.0)) + assertEquals(expected, SquareDist(x1, x2)) + } + + @Test def testXY2D = { + + val x1 = DenseMatrix((1.0, 2.0, 3.0), (4.0, 5.0, 6.0)).t + val x2 = DenseMatrix((7.0, 8.0), (9.0, 10.0)).t + + val expected = DenseMatrix((61.0, 85.0), (41.0, 61.0), (25.0, 41.0)) + assertEquals(expected, SquareDist(x1, x2)) + } +} From 85df943c9376908ff59baa6a67bf3be7abbe9c2c Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 26 Dec 2018 09:26:56 +0800 Subject: [PATCH 044/115] bug fix of GP model --- .../automl/tuner/{ => model}/GPExample.scala | 8 ++--- .../automl/tuner/model/GPKernelDiffFunc.scala | 10 +++---- .../spark/ml/automl/tuner/model/GPModel.scala | 29 ++++++++++++------- 3 files changed, 26 insertions(+), 21 deletions(-) rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/{ => model}/GPExample.scala (85%) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala similarity index 85% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala index e95f7d863..628d1516d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala @@ -1,9 +1,7 @@ -package com.tencent.angel.spark.ml.automl.tuner +package com.tencent.angel.spark.ml.automl.tuner.model -import breeze.linalg._ -import breeze.numerics._ -import com.tencent.angel.spark.ml.automl.tuner.kernel.{Matern5Iso, SquareExpIso} -import com.tencent.angel.spark.ml.automl.tuner.model.GPModel +import breeze.linalg.{DenseMatrix, DenseVector} +import com.tencent.angel.spark.ml.automl.tuner.kernel.Matern5Iso object GPExample { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala index c6d8b1b01..d0c67723c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala @@ -29,13 +29,13 @@ class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { override def calculate(params: BDV[Double]): (Double, BDV[Double]) = { try { - println(s"------iteration $iter------") + //println(s"------iteration $iter------") val covParams = BDV(params.toArray.dropRight(1)) model.covParams = covParams val noiseStdDev = params.toArray.last model.noiseStdDev = noiseStdDev - println(s"covariance params: $covParams") - println(s"standard derivative: $noiseStdDev") + //println(s"covariance params: $covParams") + //println(s"standard derivative: $noiseStdDev") val meanX = model.meanFunc(model.X) val KXX = model.calKXX() @@ -51,7 +51,7 @@ class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { //println(inv(KXX)) val loglikeLoss = - BreezeOp.logLike(meanX, KXX, invKXX, model.y) - println(s"log likelihood loss: $loglikeLoss") + //println(s"log likelihood loss: $loglikeLoss") // calculate partial derivatives val covarFuncGrads = model.covFunc.grad(model.X, model.X, covParams) @@ -65,7 +65,7 @@ class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { val allGrads = covarFuncGrads :+ covarNoiseGrad val loglikeGrads = BreezeOp.logLikeD(meanX, invKXX, model.y, allGrads).map(d => -d) - println(s"grad of covariance params: $loglikeGrads") + //println(s"grad of covariance params: $loglikeGrads") iter = iter + 1 diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala index 095d45d11..de7d96688 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala @@ -22,6 +22,7 @@ import breeze.linalg.{cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} import breeze.optimize.LBFGS import com.tencent.angel.spark.ml.automl.tuner.kernel.{Covariance, CovarianceType} import com.tencent.angel.spark.ml.automl.tuner.math.BreezeOp +import org.apache.spark.ml.linalg.DenseMatrix import scala.math._ @@ -50,8 +51,8 @@ class GPModel(val covFunc: Covariance, val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 3, tolerance = 1e-7) val newParams = optimizer.minimize(kernelDiffFunc, initParams) - println(optimizer) - println(s"new params: ${newParams}") + //println(optimizer) + //println(s"new params: ${newParams}") val newCovParams = BDV(newParams.toArray.dropRight(1)) val newNoiseStdDev = newParams.toArray.last @@ -68,22 +69,28 @@ class GPModel(val covFunc: Covariance, } def predict(newX: BDM[Double]): BDM[Double] = { - val meanX = meanFunc(X) + if (X == null || y == null) { + BDM.zeros(newX.rows, cols = 2) + } else { + val meanX = meanFunc(X) - val KXX = calKXX() + val KXX = calKXX() - val invKXX = calInvKXX(KXX) + val invKXX = calInvKXX(KXX) - val KXZ = covFunc.cov(X, newX, covParams) + val KXZ = covFunc.cov(X, newX, covParams) - val KZZ = covFunc.cov(newX, newX, covParams) + val KZZ = covFunc.cov(newX, newX, covParams) - val meanNewX = meanFunc(newX) + val meanNewX = meanFunc(newX) - val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) - val predVar = KZZ - KXZ.t * invKXX * KXZ + val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) + val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map{ v => + if (v < -1e-12) 0 else v + } - BDV.horzcat(predMean, diag(predVar)) + BDV.horzcat(predMean, predVar) + } } def calKXX(): BDM[Double] = { From af39939f75467ee8670b1cd5fc78f6ea5b5691c1 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 26 Dec 2018 09:29:38 +0800 Subject: [PATCH 045/115] GP surrogate and tuner example --- .../ml/automl/tuner/GPTunerExample.scala | 54 +++++++++++++++++++ .../{Example.scala => RFTunerExample.scala} | 2 +- .../ml/automl/tuner/acquisition/EI.scala | 9 ++-- .../acquisition/optimizer/RandomSearch.scala | 14 ++--- .../tuner/config/ConfigurationSpace.scala | 2 +- .../ml/automl/tuner/model/GPExample.scala | 18 +++++++ .../spark/ml/automl/tuner/solver/Solver.scala | 9 +++- .../automl/tuner/surrogate/GPSurrogate.scala | 33 ++++++++++-- .../automl/tuner/surrogate/RFSurrogate.scala | 6 ++- .../ml/automl/tuner/surrogate/Surrogate.scala | 2 +- .../ml/automl/tuner/trail/TestTrail.scala | 2 +- .../spark/ml/automl/utils/DataUtils.scala | 6 +-- 12 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala rename spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/{Example.scala => RFTunerExample.scala} (98%) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala new file mode 100644 index 000000000..e63955902 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala @@ -0,0 +1,54 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.automl.tuner + +import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, RFSurrogate, Surrogate} +import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector + +object GPTunerExample extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + TunerParam.setBatchSize(1) + TunerParam.setSampleSize(100) + val sur: Surrogate = new GPSurrogate(cs, true) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + val solver: Solver = new Solver(cs, sur, acq, opt) + val trail: Trail = new TestTrail() + val runner: SolverWithTrail = new SolverWithTrail(solver, trail) + val result: (Vector, Double) = runner.run(10) + sur.stop() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala similarity index 98% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala rename to spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala index 106d09e9e..6db1e3a79 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/Example.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala @@ -27,7 +27,7 @@ import com.tencent.angel.spark.ml.automl.tuner.surrogate.{RFSurrogate, Surrogate import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector -object Example extends App { +object RFTunerExample extends App { override def main(args: Array[String]): Unit = { val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala index f11a3ea1d..a21288029 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala @@ -43,7 +43,8 @@ class EI( val eta: Double = surrogate.curBest._2 //println(s"best seen result: $eta") - val s: Double = Math.sqrt(pred._2).toFloat + val m: Double = pred._1 + val s: Double = Math.sqrt(pred._2) if (s == 0) { // if std is zero, we have observed x on all instances @@ -54,9 +55,9 @@ class EI( val norm: NormalDistribution = new NormalDistribution val cdf: Double = norm.cumulativeProbability(z) val pdf: Double = norm.density(z) - val f = s * (z * cdf + pdf) - println(s"cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf, f: $f") - (f, Vectors.dense(new Array[Double](X.size))) + val ei = s * (z * cdf + pdf) + //println(s"EI of ${X.toArray.mkString("(", ",", ")")}: $ei, cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf") + (ei, Vectors.dense(new Array[Double](X.size))) } } } \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index 3ba3b7a00..7fbb1d049 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -44,16 +44,18 @@ class RandomSearch( override def maximize(numPoints: Int, sorted: Boolean = true): Array[(Double, Configuration)] = { //println(s"maximize RandomSearch") val configs: Array[Configuration] = configSpace.sampleConfig(TunerParam.sampleSize) - configs.foreach( - config => println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") - ) + //configs.foreach { config => + // println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") + //} if (sorted) { - configs.map { - config => (acqFunc.compute(config.getVector)._1, config) + configs.map { config => + (acqFunc.compute(config.getVector)._1, config) }.sortWith(_._1 > _._1).take(numPoints) } else { - rd.shuffle(configs.map{ config => (0.0, config) }.toTraversable).take(numPoints).toArray + rd.shuffle(configs.map{ + config => (0.0, config) + }.toTraversable).take(numPoints).toArray } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index d7dc65194..0122027d3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -72,7 +72,7 @@ class ConfigurationSpace( var missing: Int = 0 do { missing = size - configs.length - println(s"num of params: $numParams") + //println(s"num of params: $numParams") var vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) param2Idx.foreach { case (paramName, paramIdx) => paramDict.get(paramName) match { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala index 628d1516d..0c4aaad00 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala @@ -1,3 +1,21 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.spark.ml.automl.tuner.model import breeze.linalg.{DenseMatrix, DenseVector} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 49889344d..e5e9091f5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -42,8 +42,13 @@ class Solver( * Suggests configurations to evaluate. */ def suggest(): Array[Configuration] = { - //println(s"suggest configurations") - optimizer.maximize(TunerParam.batchSize).map(_._2) + val acqAndConfig = optimizer.maximize(TunerParam.batchSize) + println(s"suggest configurations:") + acqAndConfig.foreach{ case (acq, config) => + println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + + s"acquisition[$acq]") + } + acqAndConfig.map(_._2) } /** diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala index d8b5a5ebc..cb0e5395c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala @@ -18,8 +18,11 @@ package com.tencent.angel.spark.ml.automl.tuner.surrogate +import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} +import org.apache.spark.ml.linalg.Vector import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace -import org.apache.spark.ml.linalg.{DenseMatrix, Vector} +import com.tencent.angel.spark.ml.automl.tuner.kernel.Matern5Iso +import com.tencent.angel.spark.ml.automl.tuner.model.GPModel import com.tencent.angel.spark.ml.automl.utils.DataUtils import org.apache.commons.logging.{Log, LogFactory} @@ -30,14 +33,24 @@ class GPSurrogate( override val LOG: Log = LogFactory.getLog(classOf[RFSurrogate]) + val covFunc = Matern5Iso() + val initCovParams = BDV(1.0,1.0) + val initNoiseStdDev = 0.1 + val gpModel: GPModel = GPModel(covFunc, initCovParams, initNoiseStdDev) /** * Train the surrogate on curX and curY. */ override def train(): Unit = { + val breezeX: BDM[Double] = DataUtils.toBreeze(curX.toArray) + val breezeY: BDV[Double] = DataUtils.toBreeze(curY.toArray) + gpModel.fit(breezeX, breezeY) - val breezeX = DataUtils.toBreeze(curX.toArray) - val breezeY = DataUtils.toBreeze(curY.toArray) + /*println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n")*/ } @@ -47,7 +60,17 @@ class GPSurrogate( * @param X * @return a tuple of (mean, variance) */ - override def predict(X: Vector): (Double, Double) = ??? + override def predict(X: Vector): (Double, Double) = { + val breezeX = DataUtils.toBreeze(X).toDenseMatrix - override def stop(): Unit = ??? + val pred = gpModel.predict(breezeX) + + //println(s"predict of ${X.toArray.mkString(",")}: mean[${pred(0, 0)}] variance[${pred(0, 1)}]") + + (pred(0, 0), pred(0, 1)) + } + + override def stop(): Unit = { + + } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 37917fe99..9c9f0c62d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -41,6 +41,8 @@ class RFSurrogate( .appName("test") .getOrCreate() + ss.sparkContext.setLogLevel("ERROR") + override def train(): Unit = { if (curX.size < Math.pow(2, maxDepth - 1)) @@ -75,12 +77,12 @@ class RFSurrogate( pred.select("prediction").first().getDouble(0) } - println(s"predict of ${X.toArray.mkString(",")}: ${preds.mkString(",")}") + //println(s"tree predictions of ${X.toArray.mkString(",")}: ${preds.mkString(",")}") val mean: Double = preds.sum / preds.length val variance = preds.map(x => Math.pow(x - mean, 2)).sum / preds.length - println(s"prediction mean $mean variance $variance") + //println(s"predict of ${X.toArray.mkString(",")}: mean[$mean] variance[$variance]") (mean, variance) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index 035b950d1..3eb89b89b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -82,7 +82,7 @@ abstract class Surrogate( } def print(X: Vector, y: Double): Unit = { - println(s"update surrogate with X: ${X.toArray.mkString(",")} and Y: $y") + println(s"update surrogate with X[${X.toArray.mkString("(", ",", ")")}] and Y[$y]") } def update(X: Vector, y: Double): Unit = { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala index bbc76dd48..a8872aa3d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala @@ -29,7 +29,7 @@ class TestTrail extends Trail { 1, config.getVector.toDense.values, 1) - println(s"evaluate ${config.getVector.toArray.mkString(",")}, result $ret") + println(s"evaluate ${config.getVector.toArray.mkString("(", ",", ")")}, result $ret") ret } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala index 63ed6dd3c..302c2ca93 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala @@ -43,12 +43,12 @@ object DataUtils { parse(ss, schema, Array(X), Array(0)) } - def toBreeze(values: Array[Double]): BV[Double] = { + def toBreeze(values: Array[Double]): BDV[Double] = { new BDV[Double](values) } - def toBreeze(vector: Vector): BV[Double] = vector match { - case sv: SparseVector => new BSV[Double](sv.indices, sv.values, sv.size) + def toBreeze(vector: Vector): BDV[Double] = vector match { + case sv: SparseVector => new BDV[Double](vector.toDense.values) case dv: DenseVector => new BDV[Double](dv.values) } From b35e73e2b59a2422643ff23fdf37e6af252d7f06 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 26 Dec 2018 16:07:30 +0800 Subject: [PATCH 046/115] refine constructer --- .../ml/tree/model/DecisionTreeModel.scala | 4 +- .../ml/tree/model/TreeEnsembleModel.scala | 2 +- .../ml/automl/tuner/GPTunerExample.scala | 28 +++++-------- .../spark/ml/automl/tuner/model/GPModel.scala | 9 +++-- .../spark/ml/automl/tuner/solver/Solver.scala | 39 +++++++++++++++++-- .../ml/automl/tuner/surrogate/Surrogate.scala | 7 ++-- 6 files changed, 57 insertions(+), 32 deletions(-) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala index 8f4f6f365..45d8e0e6b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/DecisionTreeModel.scala @@ -69,7 +69,7 @@ class DecisionTreeModel ( val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] val y = instance.getY val pred = predict(x) - ret.put(DecisionTreePredictResult(idx, y, pred)) + ret.put(DecisionTreePredictResult(idx.toString, y, pred)) } ret } @@ -122,7 +122,7 @@ class DecisionTreeModel ( } } -case class DecisionTreePredictResult(sid: Long, pred: Double, label: Double) extends PredictResult { +case class DecisionTreePredictResult(sid: String, pred: Double, label: Double) extends PredictResult { val df = new DecimalFormat("0") override def getText: String = { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala index 08e8fa79c..44b113f9c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/tree/model/TreeEnsembleModel.scala @@ -177,7 +177,7 @@ class TreeEnsembleModel( val x: IntFloatVector = instance.getX.asInstanceOf[IntFloatVector] val y = instance.getY val pred = predict(x) - ret.put(DecisionTreePredictResult(idx, y, pred)) + ret.put(DecisionTreePredictResult(idx.toString, y, pred)) } ret } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala index e63955902..ca7df22fa 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala @@ -18,12 +18,9 @@ package com.tencent.angel.spark.ml.automl.tuner -import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, RFSurrogate, Surrogate} import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector @@ -34,21 +31,16 @@ object GPTunerExample extends App { val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - cs.addParam(param1) - cs.addParam(param2) - cs.addParam(param3) - cs.addParam(param4) - TunerParam.setBatchSize(1) - TunerParam.setSampleSize(100) - val sur: Surrogate = new GPSurrogate(cs, true) - val acq: Acquisition = new EI(sur, 0.1f) - val opt: AcqOptimizer = new RandomSearch(acq, cs) - val solver: Solver = new Solver(cs, sur, acq, opt) + val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() - val runner: SolverWithTrail = new SolverWithTrail(solver, trail) - val result: (Vector, Double) = runner.run(10) - sur.stop() + (0 until 20).foreach{ iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.surrogate.curBest + solver.stop() println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala index de7d96688..735e2b929 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala @@ -85,9 +85,10 @@ class GPModel(val covFunc: Covariance, val meanNewX = meanFunc(newX) val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) - val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map{ v => + val predVar = diag(KZZ - KXZ.t * invKXX * KXZ) + /* .map{ v => if (v < -1e-12) 0 else v - } + }*/ BDV.horzcat(predMean, predVar) } @@ -95,8 +96,8 @@ class GPModel(val covFunc: Covariance, def calKXX(): BDM[Double] = { val KXX = covFunc.cov(X, X, covParams) + - pow(noiseStdDev, 2) * BDM.eye[Double](X.rows) + - BDM.eye[Double](X.rows) * 1e-7 + pow(noiseStdDev, 2) * BDM.eye[Double](X.rows) + //+BDM.eye[Double](X.rows) * 1e-7 KXX } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index e5e9091f5..a7667a285 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -19,10 +19,11 @@ package com.tencent.angel.spark.ml.automl.tuner.solver import com.tencent.angel.spark.ml.automl.tuner.TunerParam -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.AcqOptimizer +import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, Surrogate} import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} @@ -62,6 +63,36 @@ class Solver( } def feed(config: Configuration, y: Double): Unit = { - surrogate.update(config.getVector, y) + if (surrogate.minimize) + surrogate.update(config.getVector, y) + else + surrogate.update(config.getVector, -y) + } + + def stop(): Unit = { + surrogate.stop + } +} + +object Solver { + + def apply(cs: ConfigurationSpace, surrogate: Surrogate, acqFuc: Acquisition, optimizer: AcqOptimizer): Solver = { + new Solver(cs, surrogate, acqFuc, optimizer) + } + + def apply(cs: ConfigurationSpace): Solver = { + val sur: Surrogate = new GPSurrogate(cs, minimize = true) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt) + } + + def apply(array: Array[ParamSpace[Double]], minimize: Boolean): Solver = { + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + array.foreach( cs.addParam(_) ) + val sur: Surrogate = new GPSurrogate(cs, minimize) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt) } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index 3eb89b89b..514c43898 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -82,7 +82,8 @@ abstract class Surrogate( } def print(X: Vector, y: Double): Unit = { - println(s"update surrogate with X[${X.toArray.mkString("(", ",", ")")}] and Y[$y]") + println(s"update surrogate with X[${X.toArray.mkString("(", ",", ")")}] " + + s"and Y[${if (minimize) y else -y}]") } def update(X: Vector, y: Double): Unit = { @@ -127,8 +128,8 @@ abstract class Surrogate( def curMax: (Vector, Double) = { if (curY.isEmpty) (null, Double.MinValue) else { - val maxIdx: Int = curY.zipWithIndex.max._2 - (curX(maxIdx), curY(maxIdx)) + val minIdx: Int = curY.zipWithIndex.min._2 + (curX(minIdx), -curY(minIdx)) } } } From 59986384379cd4e4b082b9aba5d8a4cd08d1b634 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 27 Dec 2018 10:48:09 +0800 Subject: [PATCH 047/115] avoid redundant sample --- .../ml/automl/tuner/GPTunerExample.scala | 5 ++-- .../acquisition/optimizer/RandomSearch.scala | 10 ++++--- .../automl/tuner/config/Configuration.scala | 19 +++++++++--- .../tuner/config/ConfigurationSpace.scala | 29 +++++++++++++------ .../spark/ml/automl/tuner/model/GPModel.scala | 4 +-- .../tuner/parameter/ContinuousSpace.scala | 1 + .../tuner/parameter/DiscreteSpace.scala | 3 +- .../automl/tuner/parameter/ParamSpace.scala | 3 +- .../spark/ml/automl/tuner/solver/Solver.scala | 2 ++ 9 files changed, 53 insertions(+), 23 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala index ca7df22fa..9db6ed659 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala @@ -27,6 +27,7 @@ import org.apache.spark.ml.linalg.Vector object GPTunerExample extends App { override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) @@ -39,8 +40,8 @@ object GPTunerExample extends App { val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) } - val result: (Vector, Double) = solver.surrogate.curBest - solver.stop() + val result: (Vector, Double) = solver.optimal + solver.stop println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala index 7fbb1d049..84afbdec5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -43,20 +43,22 @@ class RandomSearch( override def maximize(numPoints: Int, sorted: Boolean = true): Array[(Double, Configuration)] = { //println(s"maximize RandomSearch") - val configs: Array[Configuration] = configSpace.sampleConfig(TunerParam.sampleSize) + val configs: Array[Configuration] = configSpace.sample(TunerParam.sampleSize) //configs.foreach { config => // println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") //} - if (sorted) { + val retConfigs = if (sorted) { configs.map { config => (acqFunc.compute(config.getVector)._1, config) }.sortWith(_._1 > _._1).take(numPoints) } else { - rd.shuffle(configs.map{ - config => (0.0, config) + rd.shuffle(configs.map{ config => + (acqFunc.compute(config.getVector)._1, config) }.toTraversable).take(numPoints).toArray } + configSpace.addHistories(retConfigs.map(_._2.getVector)) + retConfigs } override def maximize: (Double, Configuration) = { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala index 9df69dadc..03dcf3568 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala @@ -19,6 +19,7 @@ package com.tencent.angel.spark.ml.automl.tuner.config import org.apache.spark.ml.linalg.Vector +import org.apache.spark.ml.param._ /** * A single configuration @@ -27,18 +28,28 @@ import org.apache.spark.ml.linalg.Vector * @param vector : A vector for efficient representation of configuration. */ class Configuration( - configSpace: ConfigurationSpace, + param2Idx: Map[String, Int], + param2Doc: Map[String, String], vector: Vector) { def getVector: Vector = vector + def getParamMap: ParamMap = { + val paramMap = ParamMap.empty + for (name: String <- param2Idx.keys) { + val param: Param[Double] = new Param(this.toString, name, param2Doc.getOrElse(name, "")) + paramMap.put(param, vector(param2Idx(name))) + } + paramMap + } + def getValues: Array[Double] = vector.toArray - def keys: List[String] = configSpace.param2Idx.keys.toList + def keys: List[String] = param2Idx.keys.toList - def get(name: String): Double = get(configSpace.param2Idx.getOrElse(name, -1)) + def get(name: String): Double = get(param2Idx.getOrElse(name, -1)) def get(idx: Int): Double = vector(idx) - def contains(name: String): Boolean = configSpace.param2Idx.contains(name) + def contains(name: String): Boolean = param2Idx.contains(name) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index 0122027d3..84f636f6a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -18,16 +18,17 @@ package com.tencent.angel.spark.ml.automl.tuner.config -import org.apache.spark.ml.linalg.{Vector, VectorUDT, Vectors} +import scala.collection.mutable.HashSet +import org.apache.spark.ml.linalg.{Vector, Vectors} import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.sql.types._ -import scala.collection.mutable.{ArrayBuffer, ListBuffer} +import scala.collection.mutable.ArrayBuffer class ConfigurationSpace( val name: String, - var paramDict: Map[String, ParamSpace[Double]] = Map()) { + private var paramDict: Map[String, ParamSpace[Double]] = Map()) { val LOG: Log = LogFactory.getLog(classOf[ConfigurationSpace]) @@ -36,8 +37,12 @@ class ConfigurationSpace( var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() var param2Idx: Map[String, Int] = paramDict.keys.zipWithIndex.toMap + var param2Doc: Map[String, String] = paramDict.map { case (k: String, v: ParamSpace[Double]) => (k, v.doc) } var idx2Param: Map[Int, String] = param2Idx.map(_.swap) + // configurations tried + var preX: HashSet[Vector] = HashSet[Vector]() + def getParamNum: Int = numParams def addParams(params: List[ParamSpace[Double]]): Unit = { @@ -49,6 +54,7 @@ class ConfigurationSpace( fields += DataTypes.createStructField(param.name, DataTypes.DoubleType, false) paramDict += (param.name -> param) param2Idx += (param.name -> numParams) + param2Doc += (param.name -> param.doc) idx2Param += (numParams -> param.name) numParams += 1 } @@ -65,8 +71,13 @@ class ConfigurationSpace( def getParamByIdx(idx: Int): Option[ParamSpace[Double]] = paramDict.get(idx2Param.getOrElse(idx, "none")) - // TODO: Store historical configurations to avoid redundancy. - def sampleConfig(size: Int): Array[Configuration] = { + def getDocByName(name: String): Option[String] = param2Doc.get(name) + + def addHistories(vecs: Array[Vector]): Unit = preX ++= vecs + + def addHistory(vec: Vector): Unit = preX += vec + + def sample(size: Int): Array[Configuration] = { var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var missing: Int = 0 @@ -83,14 +94,14 @@ class ConfigurationSpace( case None => LOG.info(s"Cannot find $paramName.") } } - vectors.filter(validConfig).foreach{ vec => - configs += new Configuration(this, vec) + vectors.filter(isValid).foreach{ vec => + configs += new Configuration(param2Idx, param2Doc, vec) } } while(configs.length < size) configs.toArray } - // TODO: Implement this func - def validConfig(vec: Vector): Boolean = true + def isValid(vec: Vector): Boolean = !preX.contains(vec) + } \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala index 735e2b929..7fa8390ce 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala @@ -49,7 +49,7 @@ class GPModel(val covFunc: Covariance, val kernelDiffFunc = new GPKernelDiffFunc(this) val initParams = BDV(covParams.toArray :+ noiseStdDev) - val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 3, tolerance = 1e-7) + val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 3, tolerance = 0.1) val newParams = optimizer.minimize(kernelDiffFunc, initParams) //println(optimizer) //println(s"new params: ${newParams}") @@ -97,7 +97,7 @@ class GPModel(val covFunc: Covariance, def calKXX(): BDM[Double] = { val KXX = covFunc.cov(X, X, covParams) + pow(noiseStdDev, 2) * BDM.eye[Double](X.rows) - //+BDM.eye[Double](X.rows) * 1e-7 + //+ BDM.eye[Double](X.rows) * 1e-7 KXX } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index 1dca71396..d91a9d7d4 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -37,6 +37,7 @@ class ContinuousSpace( upper: Double, num: Int, distribution: Distribution.Value = Distribution.LINEAR, + override val doc: String = "continuous param space", seed: Int = 100) extends ParamSpace[Double](name) { val rd = new Random(seed) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala index ab322f56f..9051fac92 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -30,7 +30,8 @@ import scala.util.Random class DiscreteSpace[T: Numeric: ClassTag]( override val name: String, values: Array[T], - seed: Int = 100) extends ParamSpace[T](name) { + override val doc: String = "discrete param", + seed: Int = 100) extends ParamSpace[T](name, doc) { val rd = new Random(seed) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala index d634b89f3..7c8d8f1ce 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -23,7 +23,8 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter * * @param name: Name of the parameter */ -abstract class ParamSpace[T: Numeric](val name: String) { +abstract class ParamSpace[T: Numeric](val name: String, + val doc: String = "param with search space") { def sample(size: Int): Array[T] diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index a7667a285..c91201dbc 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -69,6 +69,8 @@ class Solver( surrogate.update(config.getVector, -y) } + def optimal(): (Vector, Double) = surrogate.curBest + def stop(): Unit = { surrogate.stop } From ae10db309fda8f675e1ee8fa8105431c31c138bf Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 27 Dec 2018 16:32:47 +0800 Subject: [PATCH 048/115] fix negtive variance error --- .../tencent/angel/spark/ml/automl/tuner/model/GPModel.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala index 7fa8390ce..644269b43 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala @@ -85,10 +85,9 @@ class GPModel(val covFunc: Covariance, val meanNewX = meanFunc(newX) val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) - val predVar = diag(KZZ - KXZ.t * invKXX * KXZ) - /* .map{ v => + val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map{ v => if (v < -1e-12) 0 else v - }*/ + } BDV.horzcat(predMean, predVar) } From c76ce141ea04edd3501690e287a03c9accfbbdbe Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 27 Dec 2018 16:33:59 +0800 Subject: [PATCH 049/115] more friendly constructor for ParamSpace --- .../tuner/parameter/ContinuousSpace.scala | 64 +++++++++++++++---- .../tuner/parameter/DiscreteSpace.scala | 58 ++++++++++++++++- .../automl/tuner/parameter/ParamSpace.scala | 1 + .../spark/ml/automl/tuner/solver/Solver.scala | 2 +- .../automl/tuner/surrogate/GPSurrogate.scala | 4 +- .../automl/tuner/surrogate/RFSurrogate.scala | 6 +- .../ml/automl/tuner/surrogate/Surrogate.scala | 36 +++++------ .../ml/automl/utils/AutoMLException.scala | 3 + 8 files changed, 135 insertions(+), 39 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index d91a9d7d4..ce76f6a3a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter -import com.tencent.angel.spark.ml.automl.utils.Distribution +import com.tencent.angel.spark.ml.automl.utils.{AutoMLException, Distribution} import scala.collection.mutable.ArrayBuffer import scala.util.Random @@ -33,17 +33,52 @@ import scala.util.Random */ class ContinuousSpace( override val name: String, - lower: Double, - upper: Double, - num: Int, + var lower: Double, + var upper: Double, + var num: Int, distribution: Distribution.Value = Distribution.LINEAR, override val doc: String = "continuous param space", - seed: Int = 100) extends ParamSpace[Double](name) { + seed: Int = 100) extends ParamSpace[Double](name, doc) { + + private val helper: String = "supported format of continuous parameter: [0,1] or [0,1,100]" + + def this(name: String, lower: Double, upper: Double) = { + this(name, lower, upper, -1) + } + + def this(name: String, config: String) = { + this(name, 0, 1, -1) + val items = parseConfig(config) + lower = items._1 + upper = items._2 + num = items._3 + if (num != -1) { + isGrid = true + gridValues = toGrid + } + } + + def parseConfig(config: String): (Double, Double, Int) = { + val ret: (Double, Double, Int) = config.trim match { + case _ if config.contains(",") => + val splits = config.split(',') + splits.length match { + case 2 => (splits(0).toDouble, splits(1).toDouble, -1) + case 3 => (splits(0).toDouble, splits(1).toDouble, splits(2).toInt) + } + case _ => throw new AutoMLException(s"invalid discrete, $helper") + } + ret + } + + require(lower < upper, s"lower bound should less than upper bound") val rd = new Random(seed) - val values: Array[Double] = calValues - def calValues(): Array[Double] = { + var isGrid: Boolean = if (num == -1) false else true + var gridValues: Array[Double] = if (isGrid) toGrid else Array.empty + + def toGrid(): Array[Double] = { var ret: ArrayBuffer[Double] = ArrayBuffer[Double]() distribution match { case Distribution.LINEAR => @@ -61,7 +96,7 @@ class ContinuousSpace( def getUpper: Double = upper - def getValues: Array[Double] = values + def getValues: Array[Double] = gridValues def numValues: Int = num @@ -71,17 +106,22 @@ class ContinuousSpace( override def sample(size: Int): Array[Double] = Array.fill[Double](size)(sampleOne) - def sampleOne(): Double = values(rd.nextInt(numValues)) + def sampleOne(): Double = { + if (isGrid) + gridValues(rd.nextInt(numValues)) + else + lower + (upper - lower) * rd.nextDouble() + } - override def toString: String = s"ContinuousSpace[$name]: (${values mkString(",")})" + override def toString: String = s"ContinuousSpace[$name]: (${gridValues mkString(",")})" } object ContinuousSpace { def main(args: Array[String]): Unit = { - val obj = new ContinuousSpace("test", 0, 10, 5) + val obj = new ContinuousSpace("test", "0,10") println(obj.toString) - println(obj.sample(2).toString()) + println(obj.sample(2).mkString(",")) } } \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala index 9051fac92..61208849e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -18,6 +18,8 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter +import com.tencent.angel.spark.ml.automl.utils.AutoMLException + import scala.reflect.ClassTag import scala.util.Random @@ -29,10 +31,59 @@ import scala.util.Random */ class DiscreteSpace[T: Numeric: ClassTag]( override val name: String, - values: Array[T], + var values: Array[T], override val doc: String = "discrete param", seed: Int = 100) extends ParamSpace[T](name, doc) { + private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" + + def this(name: String, config: String, doc: String) = { + this(name, Array.empty[T], doc) + this.values = parseConfig(config) + } + + def this(name: String, config: String) = { + this(name, config, "discrete param") + } + + def parseConfig(config: String): Array[T] = { + val values: Array[T] = config.trim match { + case _ if config.contains(",") => + config.split(',').map(asType) + case _ if config.contains(":") => + val splits = config.split(':') + splits.length match { + case 2 => (splits(0).toDouble to splits(1).toDouble by 1.0f).toArray.map(asType) + case 3 => (splits(0).toDouble to splits(1).toDouble by splits(2).toDouble).toArray.map(asType) + case _ => throw new AutoMLException(s"invalid discrete, $helper") + } + case _ => throw new AutoMLException(s"invalid discrete, $helper") + } + values + } + + def asType(s: String): T = { + val c = implicitly[ClassTag[T]].runtimeClass + c match { + case _ if c == classOf[Int] => s.toInt.asInstanceOf[T] + case _ if c == classOf[Long] => s.toLong.asInstanceOf[T] + case _ if c == classOf[Float] => s.toFloat.asInstanceOf[T] + case _ if c == classOf[Double] => s.toDouble.asInstanceOf[T] + case _ => throw new AutoMLException(s"auto param with type ${c} is not supported") + } + } + + def asType(s: Double): T = { + val c = implicitly[ClassTag[T]].runtimeClass + c match { + case _ if c == classOf[Int] => s.toInt.asInstanceOf[T] + case _ if c == classOf[Long] => s.toLong.asInstanceOf[T] + case _ if c == classOf[Float] => s.toFloat.asInstanceOf[T] + case _ if c == classOf[Double] => s.toDouble.asInstanceOf[T] + case _ => throw new AutoMLException(s"auto param with type ${c} is not supported") + } + } + val rd = new Random(seed) def getValues: Array[T] = values @@ -50,12 +101,13 @@ class DiscreteSpace[T: Numeric: ClassTag]( def sampleOne(): T = values(rd.nextInt(numValues)) override def toString: String = s"DiscreteSpace[$name]: (${values mkString(",")})" + } object DiscreteSpace { - + def main(args: Array[String]): Unit = { - val obj = new DiscreteSpace[Float]("test", Array(1.0f, 2.0f, 3.0f, 4.0f, 5.0f)) + val obj = new DiscreteSpace[Int]("test", "1:10:1") println(obj.toString) println(obj.sample(2).toString()) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala index 7c8d8f1ce..81d0de1ce 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -18,6 +18,7 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter + /** * Base class of a single parameter's search space. * diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index c91201dbc..96b175808 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -35,7 +35,7 @@ class Solver( val LOG: Log = LogFactory.getLog(classOf[Solver]) - def getObservations(): (Array[Vector], Array[Double]) = (surrogate.curX.toArray, surrogate.curY.toArray) + def getObservations(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala index cb0e5395c..1f0e8b251 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala @@ -42,8 +42,8 @@ class GPSurrogate( * Train the surrogate on curX and curY. */ override def train(): Unit = { - val breezeX: BDM[Double] = DataUtils.toBreeze(curX.toArray) - val breezeY: BDV[Double] = DataUtils.toBreeze(curY.toArray) + val breezeX: BDM[Double] = DataUtils.toBreeze(preX.toArray) + val breezeY: BDV[Double] = DataUtils.toBreeze(preY.toArray) gpModel.fit(breezeX, breezeY) /*println("Fitted covariance function params:") diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala index 9c9f0c62d..1c8c3e1ad 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala @@ -45,10 +45,10 @@ class RFSurrogate( override def train(): Unit = { - if (curX.size < Math.pow(2, maxDepth - 1)) + if (preX.size < Math.pow(2, maxDepth - 1)) return - val data: DataFrame = DataUtils.parse(ss, schema, curX.toArray, curY.toArray) + val data: DataFrame = DataUtils.parse(ss, schema, preX.toArray, preY.toArray) val rf = new RandomForestRegressor() @@ -68,7 +68,7 @@ class RFSurrogate( */ override def predict(X: Vector): (Double, Double) = { - if (curX.size < Math.pow(2, maxDepth - 1)) { + if (preX.size < Math.pow(2, maxDepth - 1)) { return (0.0, 0.0) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index 514c43898..ea0fcae26 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -44,10 +44,10 @@ abstract class Surrogate( val LOG: Log = LogFactory.getLog(classOf[Surrogate]) - // Input data points, (N, D) - var curX: ArrayBuffer[Vector] = new ArrayBuffer[Vector]() - // Target value, (N, ) - var curY: ArrayBuffer[Double] = new ArrayBuffer[Double]() + // Previous input data points, (N, D) + var preX: ArrayBuffer[Vector] = new ArrayBuffer[Vector]() + // previous target value, (N, ) + var preY: ArrayBuffer[Double] = new ArrayBuffer[Double]() /** * Train the surrogate on curX and curY. @@ -61,10 +61,10 @@ abstract class Surrogate( * @param Y : (N, 1), the corresponding target values. */ def train(X: Array[Vector], Y: Array[Double]): Unit = { - curX.clear - curY.clear - curX ++ X - curY ++ Y + preX.clear + preY.clear + preX ++ X + preY ++ Y train } @@ -76,8 +76,8 @@ abstract class Surrogate( */ def update(X: Array[Vector], Y: Array[Double]): Unit = { X.zip(Y).foreach( tuple => print(tuple._1, tuple._2) ) - curX ++= X - curY ++= Y + preX ++= X + preY ++= Y train } @@ -88,8 +88,8 @@ abstract class Surrogate( def update(X: Vector, y: Double): Unit = { print(X, y) - curX += X - curY += y + preX += X + preY += y train } @@ -118,18 +118,18 @@ abstract class Surrogate( } def curMin: (Vector, Double) = { - if (curY.isEmpty) (null, Double.MaxValue) + if (preY.isEmpty) (null, Double.MaxValue) else { - val minIdx: Int = curY.zipWithIndex.min._2 - (curX(minIdx), curY(minIdx)) + val minIdx: Int = preY.zipWithIndex.min._2 + (preX(minIdx), preY(minIdx)) } } def curMax: (Vector, Double) = { - if (curY.isEmpty) (null, Double.MinValue) + if (preY.isEmpty) (null, Double.MinValue) else { - val minIdx: Int = curY.zipWithIndex.min._2 - (curX(minIdx), -curY(minIdx)) + val minIdx: Int = preY.zipWithIndex.min._2 + (preX(minIdx), -preY(minIdx)) } } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala new file mode 100644 index 000000000..82309ab90 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala @@ -0,0 +1,3 @@ +package com.tencent.angel.spark.ml.automl.utils + +class AutoMLException(msg: String) extends Exception(msg) From 6d30f703cadd72bf5bc958b204d2d5ccdee6db94 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 27 Dec 2018 16:34:28 +0800 Subject: [PATCH 050/115] init auto learner --- .../spark/ml/core/AutoOfflineLearner.scala | 241 ++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala new file mode 100644 index 000000000..b421ec7ef --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -0,0 +1,241 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.core + +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} +import com.tencent.angel.spark.context.PSContext +import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} +import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} +import org.apache.spark.SparkContext +import org.apache.spark.rdd.RDD + +import scala.reflect.ClassTag +import scala.util.Random + +class AutoOfflineLearner { + + // Shared configuration with Angel-PS + val conf = SharedConf.get() + + // Some params + var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) + var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) + var validationRatio: Double = conf.getDouble(MLConf.ML_VALIDATE_RATIO) + + println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") + + def evaluate(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { + val scores = data.mapPartitions { case iter => + val output = model.forward(1, iter.toArray) + Iterator.single((output, model.graph.placeHolder.getLabel)) + } + (new AUC().cal(scores), new Precision().cal(scores)) + } + + def train(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { + // split data into train and validate + val ratios = Array(1 - validationRatio, validationRatio) + val splits = data.randomSplit(ratios) + val train = splits(0) + val validate = splits(1) + + data.cache() + train.cache() + validate.cache() + + train.count() + validate.count() + data.unpersist() + + val numSplits = (1.0 / fraction).toInt + val manifold = OfflineLearner.buildManifold(train, numSplits) + + train.unpersist() + + var numUpdate = 1 + + var validateAuc = 0.0 + var validatePrecision = 0.0 + + for (epoch <- 0 until numEpoch) { + val batchIterator = OfflineLearner.buildManifoldIterator(manifold, numSplits) + while (batchIterator.hasNext) { + val (sumLoss, batchSize) = batchIterator.next().mapPartitions { case iter => + PSContext.instance() + val batch = iter.next() + model.forward(epoch, batch) + val loss = model.getLoss() + model.backward() + Iterator.single((loss, batch.length)) + }.reduce((f1, f2) => (f1._1 + f2._1, f1._2 + f2._2)) + + val (lr, boundary) = model.update(numUpdate, batchSize) + val loss = sumLoss / model.graph.taskNum + println(s"epoch=[$epoch] lr[$lr] batchSize[$batchSize] trainLoss=$loss") + if (boundary) { + var validateMetricLog = "" + if (validationRatio > 0.0) { + val metric = evaluate(validate, model) + validateAuc = metric._1 + validatePrecision = metric._2 + validateMetricLog = s"validateAuc=$validateAuc validatePrecision=$validatePrecision" + } + println(s"batch[$numUpdate] $validateMetricLog") + } + numUpdate += 1 + } + } + (validateAuc, validatePrecision) + } + + /** + * Predict the output with a RDD with data and a trained model + * @param data: examples to be predicted + * @param model: a trained model + * @return RDD[(label, predict value)] + * + */ + def predict(data: RDD[(LabeledData, String)], model: GraphModel): RDD[(String, Double)] = { + val scores = data.mapPartitions { iterator => + PSContext.instance() + val samples = iterator.toArray + val output = model.forward(1, samples.map(f => f._1)) + val labels = samples.map(f => f._2) + + (output, model.getLossFunc()) match { + case (mat :BlasDoubleMatrix, _: LogLoss) => + // For LogLoss, the output is (value, sigmoid(value), label) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1))).iterator + case (mat :BlasFloatMatrix, _: LogLoss) => + // For LogLoss, the output is (value, sigmoid(value), label) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1).toDouble)).iterator + case (mat: BlasDoubleMatrix , _: L2Loss) => + // For L2Loss, the output is (value, _, _) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0))).iterator + case (mat: BlasFloatMatrix , _: L2Loss) => + // For L2Loss, the output is (value, _, _) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0).toDouble)).iterator + } + } + scores + } + + def train(input: String, + modelOutput: String, + modelInput: String, + dim: Int, + model: GraphModel): (Double, Double) = { + val conf = SparkContext.getOrCreate().getConf + val data = SparkContext.getOrCreate().textFile(input) + .repartition(SparkUtils.getNumCores(conf)) + .map(f => DataLoader.parseIntFloat(f, dim)) + + model.init(data.getNumPartitions) + + //if (modelInput.length > 0) model.load(modelInput) + val (auc, precision) = train(data, model) + //if (modelOutput.length > 0) model.save(modelOutput) + (auc, precision) + } + + def predict(input: String, + output: String, + modelInput: String, + dim: Int, + model: GraphModel): Unit = { + val dataWithLabels = SparkContext.getOrCreate().textFile(input) + .map(f => (DataLoader.parseIntFloat(f, dim), DataLoader.parseLabel(f))) + + model.init(dataWithLabels.getNumPartitions) + model.load(modelInput) + + val predicts = predict(dataWithLabels, model) + if (output.length > 0) + predicts.map(f => s"${f._1} ${f._2}").saveAsTextFile(output) + } + +} + +object AutoOfflineLearner { + + /** + * Build manifold view for a RDD. A manifold RDD is to split a RDD to multiple RDD. + * First, we shuffle the RDD and split it into several splits inside every partition. + * Then, we hold the manifold RDD into cache. + * @param data, RDD to be split + * @param numSplit, the number of splits + * @return + */ + def buildManifold[T: ClassTag](data: RDD[T], numSplit: Int): RDD[Array[T]] = { + def shuffleAndSplit(iterator: Iterator[T]): Iterator[Array[T]] = { + val samples = Random.shuffle(iterator).toArray + val sizes = Array.tabulate(numSplit)(_ => samples.length / numSplit) + val left = samples.length % numSplit + for (i <- 0 until left) sizes(i) += 1 + + var idx = 0 + val manifold = new Array[Array[T]](numSplit) + for (a <- 0 until numSplit) { + manifold(a) = new Array[T](sizes(a)) + for (b <- 0 until sizes(a)) { + manifold(a)(b) = samples(idx) + idx += 1 + } + } + manifold.iterator + } + + val manifold = data.mapPartitions(it => shuffleAndSplit(it)) + manifold.cache() + manifold.count() + manifold + } + + /** + * Return an iterator for the manifold RDD. Each element returned by the iterator is a RDD + * which contains a split for the manifold RDD. + * @param manifold, RDD to be split + * @param numSplit, number of splits to split the manifold RDD + * @return + */ + def buildManifoldIterator[T: ClassTag](manifold: RDD[Array[T]], numSplit: Double): Iterator[RDD[Array[T]]] = { + + def skip[T](partitionId: Int, iterator: Iterator[Array[T]], skipNum: Int): Iterator[Array[T]] = { + (0 until skipNum).foreach(_ => iterator.next()) + Iterator.single(iterator.next()) + } + + new Iterator[RDD[Array[T]]] with Serializable { + var index = 0 + + override def hasNext(): Boolean = index < numSplit + + override def next(): RDD[Array[T]] = { + val batch = manifold.mapPartitionsWithIndex((partitionId, it) => skip(partitionId, it, index - 1), true) + index += 1 + batch + } + } + + } +} + From 0d9008ce97a2453329e2969e531171009b595821 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 27 Dec 2018 20:48:31 +0800 Subject: [PATCH 051/115] bug fix of covariance --- .../ml/automl/tuner/GPTunerExample.scala | 13 +++++---- .../tuner/config/ConfigurationSpace.scala | 29 +++++++++++++------ .../tuner/parameter/ContinuousSpace.scala | 2 +- .../tuner/parameter/DiscreteSpace.scala | 6 ++-- .../automl/tuner/parameter/ParamSpace.scala | 8 +++-- .../spark/ml/automl/tuner/solver/Solver.scala | 19 ++++++++++-- .../spark/ml/core/AutoOfflineLearner.scala | 3 ++ 7 files changed, 56 insertions(+), 24 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala index 9db6ed659..4226f2758 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala @@ -18,9 +18,12 @@ package com.tencent.angel.spark.ml.automl.tuner -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, Surrogate} import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector @@ -28,10 +31,10 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,100") + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") + val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() (0 until 20).foreach{ iter => diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala index 84f636f6a..61c399ec1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala @@ -21,6 +21,7 @@ package com.tencent.angel.spark.ml.automl.tuner.config import scala.collection.mutable.HashSet import org.apache.spark.ml.linalg.{Vector, Vectors} import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.ml.automl.utils.AutoMLException import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.sql.types._ @@ -28,7 +29,7 @@ import scala.collection.mutable.ArrayBuffer class ConfigurationSpace( val name: String, - private var paramDict: Map[String, ParamSpace[Double]] = Map()) { + private var paramDict: Map[String, ParamSpace[AnyVal]] = Map()) { val LOG: Log = LogFactory.getLog(classOf[ConfigurationSpace]) @@ -37,7 +38,7 @@ class ConfigurationSpace( var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() var param2Idx: Map[String, Int] = paramDict.keys.zipWithIndex.toMap - var param2Doc: Map[String, String] = paramDict.map { case (k: String, v: ParamSpace[Double]) => (k, v.doc) } + var param2Doc: Map[String, String] = paramDict.map { case (k: String, v: ParamSpace[AnyVal]) => (k, v.doc) } var idx2Param: Map[Int, String] = param2Idx.map(_.swap) // configurations tried @@ -45,11 +46,11 @@ class ConfigurationSpace( def getParamNum: Int = numParams - def addParams(params: List[ParamSpace[Double]]): Unit = { + def addParams(params: List[ParamSpace[AnyVal]]): Unit = { params.foreach(addParam) } - def addParam(param: ParamSpace[Double]): Unit = { + def addParam[T <: AnyVal](param: ParamSpace[T]): Unit = { if (!paramDict.contains(param.name)) { fields += DataTypes.createStructField(param.name, DataTypes.DoubleType, false) paramDict += (param.name -> param) @@ -63,13 +64,13 @@ class ConfigurationSpace( def getFields: Array[StructField] = fields.toArray - def getParams(): Array[ParamSpace[Double]] = paramDict.values.toArray + def getParams(): Array[ParamSpace[AnyVal]] = paramDict.values.toArray - def getParamByName(name: String): Option[ParamSpace[Double]] = paramDict.get(name) + def getParamByName(name: String): Option[ParamSpace[AnyVal]] = paramDict.get(name) def getIdxByParam(name: String): Option[Int] = param2Idx.get(name) - def getParamByIdx(idx: Int): Option[ParamSpace[Double]] = paramDict.get(idx2Param.getOrElse(idx, "none")) + def getParamByIdx(idx: Int): Option[ParamSpace[AnyVal]] = paramDict.get(idx2Param.getOrElse(idx, "none")) def getDocByName(name: String): Option[String] = param2Doc.get(name) @@ -84,11 +85,11 @@ class ConfigurationSpace( do { missing = size - configs.length //println(s"num of params: $numParams") - var vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) param2Idx.foreach { case (paramName, paramIdx) => paramDict.get(paramName) match { case Some(param) => - param.sample(missing).zipWithIndex.foreach { case (f: Double, i: Int) => + param.sample(missing).map(asDouble).zipWithIndex.foreach { case (f: Double, i: Int) => vectors(i).toArray(paramIdx) = f } case None => LOG.info(s"Cannot find $paramName.") @@ -102,6 +103,16 @@ class ConfigurationSpace( configs.toArray } + def asDouble(num: AnyVal): Double = { + num match { + case i: Int => i.toDouble + case i: Long => i.toLong + case i: Float => i.toDouble + case i: Double => i + case _ => throw new AutoMLException(s"type ${num.getClass} is not supported") + } + } + def isValid(vec: Vector): Boolean = !preX.contains(vec) } \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala index ce76f6a3a..26067cd49 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala @@ -104,7 +104,7 @@ class ContinuousSpace( def toRandomSpace: ParamSpace[Double] = this - override def sample(size: Int): Array[Double] = Array.fill[Double](size)(sampleOne) + override def sample(size: Int): List[Double] = List.fill[Double](size)(sampleOne) def sampleOne(): Double = { if (isGrid) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala index 61208849e..d3d00ca00 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala @@ -29,7 +29,7 @@ import scala.util.Random * @param name: Name of the parameter * @param values: List of all possible values */ -class DiscreteSpace[T: Numeric: ClassTag]( +class DiscreteSpace[T <: AnyVal: ClassTag]( override val name: String, var values: Array[T], override val doc: String = "discrete param", @@ -94,8 +94,8 @@ class DiscreteSpace[T: Numeric: ClassTag]( def toRandomSpace: ParamSpace[T] = this - def sample(size: Int): Array[T] = { - Array.fill[T](size)(sampleOne) + def sample(size: Int): List[T] = { + List.fill[T](size)(sampleOne) } def sampleOne(): T = values(rd.nextInt(numValues)) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala index 81d0de1ce..205cf437f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala @@ -18,16 +18,18 @@ package com.tencent.angel.spark.ml.automl.tuner.parameter +import scala.reflect.ClassTag + /** * Base class of a single parameter's search space. * * @param name: Name of the parameter */ -abstract class ParamSpace[T: Numeric](val name: String, - val doc: String = "param with search space") { +abstract class ParamSpace[+T: ClassTag](val name: String, + val doc: String = "param with search space") { - def sample(size: Int): Array[T] + def sample(size: Int): List[T] def sampleOne(): T diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 96b175808..afa6489e6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -35,10 +35,14 @@ class Solver( val LOG: Log = LogFactory.getLog(classOf[Solver]) - def getObservations(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) + def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate + def addParam(param: ParamSpace[AnyVal]): Unit = { + cs.addParam(param) + } + /** * Suggests configurations to evaluate. */ @@ -89,12 +93,21 @@ object Solver { new Solver(cs, sur, acq, opt) } - def apply(array: Array[ParamSpace[Double]], minimize: Boolean): Solver = { + def apply(array: Array[ParamSpace[AnyVal]], minimize: Boolean): Solver = { + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + array.foreach(cs.addParam) + val sur: Surrogate = new GPSurrogate(cs, minimize) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt) + } + + def apply(minimize: Boolean): Solver = { val cs: ConfigurationSpace = new ConfigurationSpace("cs") - array.foreach( cs.addParam(_) ) val sur: Surrogate = new GPSurrogate(cs, minimize) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) new Solver(cs, sur, acq, opt) } + } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index b421ec7ef..74c989853 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -23,6 +23,7 @@ import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext +import com.tencent.angel.spark.ml.automl.tuner.solver.Solver import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} import org.apache.spark.SparkContext @@ -43,6 +44,8 @@ class AutoOfflineLearner { println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") + val solver: Solver = Solver(true) + def evaluate(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { val scores = data.mapPartitions { case iter => val output = model.forward(1, iter.toArray) From 9faa80dd73f6af495bc4bb60a2b1c201b8842dea Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 29 Dec 2018 00:58:21 +0800 Subject: [PATCH 052/115] auto learner, reset param, and an example --- .../ml/core/network/layers/AngelGraph.scala | 8 +++ .../angel/ml/core/optimizer/Adam.scala | 15 +++- .../angel/ml/core/optimizer/FTRL.scala | 10 ++- .../angel/ml/core/optimizer/Momentum.scala | 9 ++- .../angel/ml/core/optimizer/Optimizer.scala | 8 +++ .../ml/automl/tuner/model/GPExample.scala | 2 + .../spark/ml/automl/tuner/solver/Solver.scala | 24 ++++++- .../spark/ml/core/AutoOfflineLearner.scala | 69 +++++++++++++++++-- .../angel/spark/ml/core/GraphModel.scala | 15 +++- .../tencent/angel/spark/ml/AutoLRTest.scala | 49 +++++++++++++ 10 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/network/layers/AngelGraph.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/network/layers/AngelGraph.scala index 8981e3ba4..7418979b6 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/network/layers/AngelGraph.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/network/layers/AngelGraph.scala @@ -31,6 +31,7 @@ import com.tencent.angel.ml.core.utils.PSMatrixUtils import com.tencent.angel.model.{ModelLoadContext, ModelSaveContext} import org.apache.commons.logging.{Log, LogFactory} +import scala.collection.mutable import scala.concurrent.ExecutionContext.Implicits.global import scala.collection.mutable.{ArrayBuffer, ListBuffer} import scala.concurrent.duration.Duration @@ -161,6 +162,13 @@ class AngelGraph(val placeHolder: PlaceHolder, val conf: SharedConf) extends Ser trainableLayer.foreach { layer => layer.init(taskId) } } + def resetParam(paramMap: mutable.Map[String, Double]): this.type = { + trainableLayer.foreach { trainable => + trainable.optimizer.resetParam(paramMap) + } + this + } + /** * Create matrices contain in the model, this method is only used in Driver/Client * diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Adam.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Adam.scala index fbcb31837..996241434 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Adam.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Adam.scala @@ -25,13 +25,22 @@ import com.tencent.angel.ml.psf.optimizer.AdamUpdateFunc import com.tencent.angel.psagent.PSAgentContext import org.apache.commons.logging.LogFactory +import scala.collection.mutable + class Adam(override val stepSize: Double, - val gamma: Double = 0.99, - val beta: Double = 0.9, - val epsilon: Double = 1e-7) extends GradientDescent(stepSize) { + var gamma: Double = 0.99, + var beta: Double = 0.9, + var epsilon: Double = 1e-7) extends GradientDescent(stepSize) { val LOG = LogFactory.getLog(classOf[Adam]) + override def resetParam(paramMap: mutable.Map[String, Double]): Unit = { + super.resetParam(paramMap) + gamma = paramMap.getOrElse("gamma", gamma) + beta = paramMap.getOrElse("beta", beta) + epsilon = paramMap.getOrElse("epsilon", epsilon) + } + override def update(matrixId: Int, numFactors: Int, epoch: Int): Future[VoidResult] = { val func = new AdamUpdateFunc(matrixId, numFactors, gamma, epsilon, beta, lr, regL2Param, epoch) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/FTRL.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/FTRL.scala index 981536eed..8c8a726e7 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/FTRL.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/FTRL.scala @@ -24,7 +24,15 @@ import com.tencent.angel.ml.matrix.psf.update.base.VoidResult import com.tencent.angel.ml.psf.optimizer.FTRLUpdateFunc import com.tencent.angel.psagent.PSAgentContext -class FTRL(override val stepSize: Double, alpha: Double, beta: Double) extends GradientDescent(stepSize) { +import scala.collection.mutable + +class FTRL(override val stepSize: Double, var alpha: Double, var beta: Double) extends GradientDescent(stepSize) { + + override def resetParam(paramMap: mutable.Map[String, Double]): Unit = { + super.resetParam(paramMap) + alpha = paramMap.getOrElse("alpha", alpha) + beta = paramMap.getOrElse("beta", beta) + } override def update(matrixId: Int, numFactors: Int, epoch: Int = 0): Future[VoidResult] = { diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Momentum.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Momentum.scala index 651a7291f..b7176d5e0 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Momentum.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Momentum.scala @@ -24,7 +24,14 @@ import com.tencent.angel.ml.matrix.psf.update.base.VoidResult import com.tencent.angel.ml.psf.optimizer.MomentumUpdateFunc import com.tencent.angel.psagent.PSAgentContext -class Momentum(override val stepSize: Double, val momentum: Double = 0.9) extends GradientDescent(stepSize) { +import scala.collection.mutable + +class Momentum(override val stepSize: Double, var momentum: Double = 0.9) extends GradientDescent(stepSize) { + + override def resetParam(paramMap: mutable.Map[String, Double]): Unit = { + super.resetParam(paramMap) + momentum = paramMap.getOrElse("momentum", momentum) + } override def update(matrixId: Int, numFactors: Int, epoch: Int = 0): Future[VoidResult] = { val func = new MomentumUpdateFunc(matrixId, numFactors, momentum, lr, regL2Param) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Optimizer.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Optimizer.scala index cc4815fe0..ba172ba63 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Optimizer.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/optimizer/Optimizer.scala @@ -23,11 +23,19 @@ import java.util.concurrent.Future import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.matrix.psf.update.base.VoidResult +import scala.collection.mutable + trait Optimizer extends Serializable { var lr: Double = 0.1 protected var regL1Param: Double = SharedConf.get().getDouble(MLConf.ML_REG_L1) protected var regL2Param: Double = SharedConf.get().getDouble(MLConf.ML_REG_L2) + def resetParam(paramMap: mutable.Map[String, Double]): Unit = { + lr = paramMap.getOrElse(MLConf.ML_LEARN_RATE, lr) + regL1Param = paramMap.getOrElse(MLConf.ML_REG_L1, regL1Param) + regL2Param = paramMap.getOrElse(MLConf.ML_REG_L2, regL1Param) + } + def setLearningRate(lr: Double): this.type = { this.lr = lr this diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala index 0c4aaad00..6f4d82bdc 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala @@ -25,6 +25,8 @@ object GPExample { def main(args: Array[String]): Unit = { + println(Double.getClass.getSimpleName) + val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index afa6489e6..6d75da108 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -22,8 +22,9 @@ import com.tencent.angel.spark.ml.automl.tuner.TunerParam import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, Surrogate} +import com.tencent.angel.spark.ml.automl.utils.AutoMLException import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} @@ -35,6 +36,8 @@ class Solver( val LOG: Log = LogFactory.getLog(classOf[Solver]) + val PARAM_TYPES: Array[String] = Array("discrete", "continuous") + def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate @@ -43,6 +46,25 @@ class Solver( cs.addParam(param) } + def addParam(pType: String, vType: String, name: String, config: String): Unit = { + pType.toLowerCase match { + case "discrete" => + vType.toLowerCase match { + case "float" => addParam(new DiscreteSpace[Float](name, config)) + case "double" => addParam(new DiscreteSpace[Double](name, config)) + case "int" => addParam(new DiscreteSpace[Int](name, config)) + case "long" => addParam(new DiscreteSpace[Long](name, config)) + case _ => throw new AutoMLException(s"unsupported value type $vType") + } + case "continuous" => + vType.toLowerCase match { + case "double" => addParam(new ContinuousSpace(name, config)) + case _ => throw new AutoMLException(s"unsupported value type $vType") + } + case _ => throw new AutoMLException(s"unsupported param type $pType, should be ${PARAM_TYPES.mkString(",")}") + } + } + /** * Suggests configurations to evaluate. */ diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 74c989853..38af55581 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -23,16 +23,21 @@ import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext +import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace import com.tencent.angel.spark.ml.automl.tuner.solver.Solver +import com.tencent.angel.spark.ml.automl.utils.AutoMLException import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} import org.apache.spark.SparkContext +import org.apache.spark.ml.linalg.Vector import org.apache.spark.rdd.RDD +import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner { +class AutoOfflineLearner(minimize: Boolean) { // Shared configuration with Angel-PS val conf = SharedConf.get() @@ -41,10 +46,45 @@ class AutoOfflineLearner { var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) var validationRatio: Double = conf.getDouble(MLConf.ML_VALIDATE_RATIO) + var tuneIter: Int = 20 println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - val solver: Solver = Solver(true) + val solver: Solver = Solver(minimize) + + // param name -> param type (continuous or discrete), value type (int, double,...) + val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() + + def addParam(param: ParamSpace[AnyVal]): this.type = { + solver.addParam(param) + this + } + + def addParam(pType: String, vType: String, name: String, config: String): this.type = { + paramType += name -> (pType.toLowerCase, vType.toLowerCase) + solver.addParam(pType, vType, name, config) + this + } + + def setParam(name: String, vType: String, value: Double): Unit = { + println(s"set param[$name] type[$vType] value[$value]") + vType match { + case "int" => conf.setInt(name, value.toInt) + case "long" => conf.setLong(name, value.toLong) + case "float" => conf.setFloat(name, value.toFloat) + case "double" => conf.setDouble(name, value) + case _ => throw new AutoMLException(s"unsupported value type $vType") + } + } + + def resetParam(paramMap: mutable.Map[String, Double]): this.type = { + paramMap.foreach(println) + numEpoch = paramMap.getOrElse(MLConf.ML_EPOCH_NUM, numEpoch.toDouble).toInt + fraction = paramMap.getOrElse(MLConf.ML_BATCH_SAMPLE_RATIO, fraction) + validationRatio = paramMap.getOrElse(MLConf.ML_VALIDATE_RATIO, validationRatio) + println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") + this + } def evaluate(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { val scores = data.mapPartitions { case iter => @@ -146,7 +186,7 @@ class AutoOfflineLearner { modelOutput: String, modelInput: String, dim: Int, - model: GraphModel): (Double, Double) = { + model: GraphModel): Unit = { val conf = SparkContext.getOrCreate().getConf val data = SparkContext.getOrCreate().textFile(input) .repartition(SparkUtils.getNumCores(conf)) @@ -154,10 +194,27 @@ class AutoOfflineLearner { model.init(data.getNumPartitions) - //if (modelInput.length > 0) model.load(modelInput) - val (auc, precision) = train(data, model) + if (modelInput.length > 0) model.load(modelInput) + + (0 until tuneIter).foreach{ iter => + println(s"==========Tuner Iteration[$iter]==========") + val config: Configuration = solver.suggest()(0) + val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() + for (paramType <- paramType) { + setParam(paramType._1, paramType._2._2, config.get(paramType._1)) + paramMap += (paramType._1 -> config.get(paramType._1)) + } + resetParam(paramMap) + model.resetParam(paramMap).graph.init(0) + val result = train(data, model) + solver.feed(config, result._1) + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + //if (modelOutput.length > 0) model.save(modelOutput) - (auc, precision) + } def predict(input: String, diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/GraphModel.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/GraphModel.scala index e1265a5b8..73250129c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/GraphModel.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/GraphModel.scala @@ -19,7 +19,7 @@ package com.tencent.angel.spark.ml.core -import com.tencent.angel.ml.core.conf.SharedConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.core.network.layers.{AngelGraph, PlaceHolder, STATUS} import com.tencent.angel.ml.core.optimizer.decayer._ import com.tencent.angel.ml.core.optimizer.loss.LossFunc @@ -30,13 +30,15 @@ import com.tencent.angel.model.{ModelLoadContext, ModelSaveContext} import com.tencent.angel.spark.context.AngelPSContext import org.json4s.JsonAST.JValue +import scala.collection.mutable + class GraphModel extends Serializable { val conf = SharedConf.get() implicit val graph = new AngelGraph(new PlaceHolder()) var jsonAst: JValue = conf.getJson - val stepSize: Double = SharedConf.learningRate - val scheduler: StepSizeScheduler = new StandardDecay(stepSize) + var stepSize: Double = SharedConf.learningRate + var scheduler: StepSizeScheduler = new StandardDecay(stepSize) def ensureJsonAst(): Unit = { if (jsonAst == null) { @@ -50,6 +52,13 @@ class GraphModel extends Serializable { JsonUtils.fillGraph(jsonAst) } + def resetParam(paramMap: mutable.Map[String, Double]): this.type = { + stepSize = paramMap.getOrElse(MLConf.ML_LEARN_RATE, stepSize) + scheduler = new StandardDecay(stepSize) + graph.resetParam(paramMap) + this + } + def init(taskNum: Int): Unit = { network() diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala new file mode 100644 index 000000000..aa1867040 --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala @@ -0,0 +1,49 @@ +package com.tencent.angel.spark.ml + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.matrix.RowType +import com.tencent.angel.spark.ml.classification.LogisticRegression +import com.tencent.angel.spark.ml.core.{AutoOfflineLearner, OfflineLearner} + +class AutoLRTest extends PSFunSuite with SharedPSContext { + private var learner: AutoOfflineLearner = _ + private var input: String = _ + private var dim: Int = _ + + override def beforeAll(): Unit = { + super.beforeAll() + + input = "../../data/census/census_148d_train.libsvm" + + // build SharedConf with params + SharedConf.get() + SharedConf.get().set(MLConf.ML_MODEL_TYPE, RowType.T_FLOAT_DENSE.toString) + SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) + SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) + SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) + SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) + SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) + SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) + SharedConf.get().setDouble(MLConf.ML_BATCH_SAMPLE_RATIO, 0.2) + dim = SharedConf.indexRange.toInt + + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + learner = new AutoOfflineLearner(false) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100") + } + + override def afterAll(): Unit = { + super.afterAll() + } + + test("LogisticRegression") { + val model = new LogisticRegression + learner.train(input, "", "", dim, model) + } + +} From 00e059449265ce49d43f2e0670066bfc11aeb5f1 Mon Sep 17 00:00:00 2001 From: huanranxue Date: Sat, 29 Dec 2018 17:37:53 +0800 Subject: [PATCH 053/115] basic architecture of auto feature --- .../ml/automl/feature/PipelineDriver.scala | 18 +++++++ .../ml/automl/feature/PipelineWrapper.scala | 27 ++++++++++ .../automl/feature/TransformerWrapper.scala | 3 +- .../ml/automl/feature/UserProfileLoader.scala | 22 ++++++++ .../preprocess/MinMaxScalerWrapper.scala | 50 +++++++++++++++++++ .../preprocess/StandardScalerWrapper.scala | 48 ++++++++++++++++++ .../preprocess/StopWordsRemoverWrapper.scala | 1 + 7 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala new file mode 100644 index 000000000..dd4a2280d --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala @@ -0,0 +1,18 @@ +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.sql.SparkSession + +object PipelineDriver { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + + val inputPath = "data/" + + val inputDF = DataLoader.load(spark, "libsvm", "input/data") + + + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala new file mode 100644 index 000000000..84d226d3f --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala @@ -0,0 +1,27 @@ +package com.tencent.angel.spark.ml.automl.feature + +import org.apache.spark.ml.Pipeline + +class PipelineWrapper { + + var components: Array[TransformerWrapper] = ??? + + val pipeline = new Pipeline() + + def setComponents(components: Array[TransformerWrapper]): Unit = { + this.components = components + } + + def fit() = _ + + def transform() = _ + +} + +class LinearPipeline { + +} + +class DAGPipeline { + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala index 56f08926e..e120c13f5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala @@ -23,7 +23,7 @@ import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InToOutRelation abstract class TransformerWrapper { - val transformer: Transformer + var transformer: Transformer var parent: TransformerWrapper val relation: InToOutRelation @@ -31,6 +31,7 @@ abstract class TransformerWrapper { val hasMultiInputs: Boolean val hasMultiOutputs: Boolean val needAncestorInputs: Boolean + val needFit: Boolean private val prefix = "out_" val requiredInputCols: Array[String] diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala new file mode 100644 index 000000000..03dfa50b9 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala @@ -0,0 +1,22 @@ +package com.tencent.angel.spark.ml.automl.feature + +import com.tencent.angel.spark.ml.automl.feature.preprocess.{SamplerWrapper, StopWordsRemoverWrapper, TokenizerWrapper} + +import scala.collection.mutable.ArrayBuffer + +class UserProfileLoader { + + private var selectedComponents: ArrayBuffer[String] = ??? + + private def componentToTransformers(component: String): TransformerWrapper = { + component match { + case "SamplerWrapper" => new SamplerWrapper(0.5) + case "StopWordsRemoverWrapper" => new StopWordsRemoverWrapper() + case "Tokenizer" => new TokenizerWrapper() + } + } + + def load(): Array[TransformerWrapper] = { + _ + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala new file mode 100644 index 000000000..de103512a --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala @@ -0,0 +1,50 @@ +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import org.apache.spark.ml.{Estimator, Transformer} +import org.apache.spark.ml.feature.{MinMaxScaler, MinMaxScalerModel} +import org.apache.spark.ml.linalg.Vectors +import org.apache.spark.sql.{DataFrame, Dataset, SparkSession} + +private[preprocess] class MinMaxScalerWrapper extends TransformerWrapper { + + override var transformer: Transformer = _ + val estimator = new MinMaxScaler() + override val parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("numerical") + override val requiredOutputCols: Array[String] = Array("minMaxNumerical") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[MinMaxScalerModel].setInputCol(getInputCols(0)) + transformer.asInstanceOf[MinMaxScalerModel].setOutputCol(getOutputCols(0)) + this + } + + def fit(dataFrame: DataFrame): Unit = { + transformer = estimator.fit(dataFrame) + } + + def transform(dataset: Dataset[_]): DataFrame = { + + val inputCol = "features" + val OutputCol = "scaledFeatures" + + val df = dataset.toDF() + + val scaler = new MinMaxScaler().setInputCol("features").setOutputCol("scaledFeatures") + + val scalerModel = scaler.fit(df) + + val scaledDf = scalerModel.transform(df) + + scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala new file mode 100644 index 000000000..1c333e362 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala @@ -0,0 +1,48 @@ +package com.tencent.angel.spark.ml.automl.feature.preprocess + +import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import org.apache.spark.ml.Transformer +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.ml.feature.{StandardScaler, StandardScalerModel} + +class StandardScalerWrapper extends TransformerWrapper { + + override val transformer: Transformer = _ + override val parent: TransformerWrapper = _ + val estimator = new StandardScaler() + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("numerical") + override val requiredOutputCols: Array[String] = Array("standardNumerical") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[StandardScalerModel].setInputCol(getInputCols(0)) + transformer.asInstanceOf[StandardScalerModel].setOutputCol(getOutputCols(0)) + this + } + + def fit(df: DataFrame): Transformer = { + estimator.fit(df) + } + + def transform(dataset: Dataset[_]): DataFrame = { + val df = dataset.toDF() + + val scaler = new StandardScaler() + .setInputCol("features") + .setOutputCol("scaledFeatures") + .setWithStd(true) + .setWithMean(true) + val scalerModel = scaler.fit(df) + + val scaledDf = scalerModel.transform(df) + + scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala index 51f2ab1ca..39232112e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -31,6 +31,7 @@ class StopWordsRemoverWrapper extends TransformerWrapper { override val hasMultiInputs: Boolean = false override val hasMultiOutputs: Boolean = false override val needAncestorInputs: Boolean = false + override val needFit: Boolean = false override val relation: InToOutRelation = OneToOne From 3ef6cd75fb1e0d2bc584f7111c1ed591f4851e2f Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 2 Jan 2019 17:57:04 +0800 Subject: [PATCH 054/115] minimize bug gix --- .../spark/ml/automl/tuner/solver/Solver.scala | 9 ++++++--- .../ml/automl/tuner/surrogate/Surrogate.scala | 16 +++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala index 6d75da108..a567ef09f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala @@ -85,14 +85,17 @@ class Solver( */ def feed(configs: Array[Configuration], Y: Array[Double]): Unit = { //println(s"feed ${configs.size} configurations") - surrogate.update(configs.map(_.getVector), Y) + if (surrogate.minimize) + surrogate.update(configs.map(_.getVector), Y.map(-_)) + else + surrogate.update(configs.map(_.getVector), Y) } def feed(config: Configuration, y: Double): Unit = { if (surrogate.minimize) - surrogate.update(config.getVector, y) - else surrogate.update(config.getVector, -y) + else + surrogate.update(config.getVector, y) } def optimal(): (Vector, Double) = surrogate.curBest diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala index ea0fcae26..33a6ce102 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala @@ -83,7 +83,7 @@ abstract class Surrogate( def print(X: Vector, y: Double): Unit = { println(s"update surrogate with X[${X.toArray.mkString("(", ",", ")")}] " + - s"and Y[${if (minimize) y else -y}]") + s"and Y[${if (minimize) -y else y}]") } def update(X: Vector, y: Double): Unit = { @@ -118,18 +118,20 @@ abstract class Surrogate( } def curMin: (Vector, Double) = { - if (preY.isEmpty) (null, Double.MaxValue) + if (preY.isEmpty) + (null, Double.MaxValue) else { - val minIdx: Int = preY.zipWithIndex.min._2 - (preX(minIdx), preY(minIdx)) + val maxIdx: Int = preY.zipWithIndex.max._2 + (preX(maxIdx), -preY(maxIdx)) } } def curMax: (Vector, Double) = { - if (preY.isEmpty) (null, Double.MinValue) + if (preY.isEmpty) + (null, Double.MinValue) else { - val minIdx: Int = preY.zipWithIndex.min._2 - (preX(minIdx), -preY(minIdx)) + val maxIdx: Int = preY.zipWithIndex.max._2 + (preX(maxIdx), preY(maxIdx)) } } } From 3e46fbfa39eb6c6062f4bb3917e0d0d516d462a5 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 4 Jan 2019 14:16:12 +0800 Subject: [PATCH 055/115] automl module --- .gitignore | 1 + spark-on-angel/automl/pom.xml | 34 +++++++ .../angel/spark}/automl/AutoConf.scala | 8 +- .../spark}/automl/feature/DataLoader.scala | 2 +- .../automl/feature/InToOutRelation.scala | 2 +- .../automl/feature/PipelineBuilder.scala | 2 +- .../automl/feature/TransformerWrapper.scala | 4 +- .../automl/feature/cross/FeatureCross.scala | 2 +- .../feature/preprocess/Components.scala | 2 +- .../feature/preprocess/FPreprocess.scala | 21 ++--- .../automl/feature/preprocess/Sampler.scala | 2 +- .../feature/preprocess/SamplerWrapper.scala | 8 +- .../preprocess/StopWordsRemoverWrapper.scala | 6 +- .../feature/preprocess/TPreprocess.scala | 2 +- .../feature/preprocess/TokenizerWrapper.scala | 6 +- .../feature/select/FeatureSelector.scala | 2 +- .../automl/feature/transform/FTransform.scala | 16 ++-- .../spark}/automl/tuner/GPTunerExample.scala | 18 ++-- .../spark}/automl/tuner/RFTunerExample.scala | 16 ++-- .../spark}/automl/tuner/TunerParam.scala | 4 +- .../tuner/acquisition/Acquisition.scala | 4 +- .../spark}/automl/tuner/acquisition/EI.scala | 8 +- .../acquisition/optimizer/AcqOptimizer.scala | 6 +- .../acquisition/optimizer/LocalSearch.scala | 6 +- .../acquisition/optimizer/RandomSearch.scala | 8 +- .../automl/tuner/config/Configuration.scala | 2 +- .../tuner/config/ConfigurationSpace.scala | 11 +-- .../automl/tuner/kernel/CoVariance.scala | 2 +- .../automl/tuner/kernel/CovarianceType.scala | 2 +- .../spark}/automl/tuner/kernel/Matern3.scala | 5 +- .../spark}/automl/tuner/kernel/Matern5.scala | 4 +- .../automl/tuner/kernel/Matern5Iso.scala | 4 +- .../automl/tuner/kernel/SquareExpIso.scala | 4 +- .../spark}/automl/tuner/math/BreezeOp.scala | 2 +- .../spark}/automl/tuner/math/SquareDist.scala | 7 +- .../spark}/automl/tuner/model/GPExample.scala | 8 +- .../automl/tuner/model/GPKernelDiffFunc.scala | 8 +- .../spark}/automl/tuner/model/GPModel.scala | 11 +-- .../tuner/parameter/ContinuousSpace.scala | 5 +- .../tuner/parameter/DiscreteSpace.scala | 5 +- .../automl/tuner/parameter/ParamSpace.scala | 2 +- .../spark}/automl/tuner/solver/Solver.scala | 19 ++-- .../automl/tuner/solver/SolverWithTrail.scala | 6 +- .../automl/tuner/surrogate/GPSurrogate.scala | 12 +-- .../automl/tuner/surrogate/RFSurrogate.scala | 6 +- .../automl/tuner/surrogate/Surrogate.scala | 4 +- .../automl/tuner/trail/TestRunner.scala | 6 +- .../spark}/automl/tuner/trail/TestTrail.scala | 4 +- .../spark}/automl/tuner/trail/Trail.scala | 4 +- .../automl/tuner/trail/TrailRunner.scala | 4 +- .../angel/spark/automl/utils/ArgsUtil.scala | 41 +++++++++ .../spark}/automl/utils/AutoMLException.scala | 2 +- .../angel/spark}/automl/utils/DataUtils.scala | 2 +- .../spark}/automl/utils/Distribution.scala | 2 +- .../angel/spark/automl/GPModelTest.scala | 91 +++++++++++++++++++ .../angel/spark/automl}/SquareDistTest.scala | 4 +- spark-on-angel/mllib/pom.xml | 5 + .../spark/ml/core/AutoOfflineLearner.scala | 8 +- .../tencent/angel/spark/ml/AutoLRTest.scala | 2 +- spark-on-angel/pom.xml | 1 + 60 files changed, 337 insertions(+), 158 deletions(-) create mode 100644 spark-on-angel/automl/pom.xml rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/AutoConf.scala (86%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/DataLoader.scala (98%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/InToOutRelation.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/PipelineBuilder.scala (97%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/TransformerWrapper.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/cross/FeatureCross.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/Components.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/FPreprocess.scala (79%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/Sampler.scala (97%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/SamplerWrapper.scala (83%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/StopWordsRemoverWrapper.scala (87%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/TPreprocess.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/preprocess/TokenizerWrapper.scala (87%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/select/FeatureSelector.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/transform/FTransform.scala (77%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/GPTunerExample.scala (70%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/RFTunerExample.scala (75%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/TunerParam.scala (88%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/acquisition/Acquisition.scala (90%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/acquisition/EI.scala (87%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/acquisition/optimizer/AcqOptimizer.scala (85%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/acquisition/optimizer/LocalSearch.scala (89%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/acquisition/optimizer/RandomSearch.scala (88%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/config/Configuration.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/config/ConfigurationSpace.scala (93%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/CoVariance.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/CovarianceType.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/Matern3.scala (94%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/Matern5.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/Matern5Iso.scala (95%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/kernel/SquareExpIso.scala (93%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/math/BreezeOp.scala (97%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/math/SquareDist.scala (91%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/model/GPExample.scala (91%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/model/GPKernelDiffFunc.scala (89%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/model/GPModel.scala (91%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/parameter/ContinuousSpace.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/parameter/DiscreteSpace.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/parameter/ParamSpace.scala (94%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/solver/Solver.scala (87%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/solver/SolverWithTrail.scala (89%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/surrogate/GPSurrogate.scala (83%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/surrogate/RFSurrogate.scala (93%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/surrogate/Surrogate.scala (96%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/trail/TestRunner.scala (84%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/trail/TestTrail.scala (90%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/trail/Trail.scala (87%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/tuner/trail/TrailRunner.scala (88%) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/ArgsUtil.scala rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/utils/AutoMLException.scala (55%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/utils/DataUtils.scala (97%) rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/utils/Distribution.scala (95%) create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/GPModelTest.scala rename spark-on-angel/{mllib/src/test/scala/com/tencent/angel/spark/ml/math => automl/src/test/scala/com/tencent/angel/spark/automl}/SquareDistTest.scala (94%) diff --git a/.gitignore b/.gitignore index b4056e3d8..7c37a611e 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ dist/target/ spark-on-angel/core/target/ spark-on-angel/examples/target/ spark-on-angel/mllib/target/ +spark-on-angel/automl/target spark-on-angel/target/ spark-on-angel/core/log/ spark-on-angel/examples/log/ diff --git a/spark-on-angel/automl/pom.xml b/spark-on-angel/automl/pom.xml new file mode 100644 index 000000000..d97c8b739 --- /dev/null +++ b/spark-on-angel/automl/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + + spark-on-angel + com.tencent.angel + 2.0.0 + ../pom.xml + + + spark-on-angel-automl + + + 2.2.0 + ${project.parent.parent.basedir} + + + + + org.apache.spark + spark-core_${scala.binary.version} + ${spark.version} + + + org.apache.spark + spark-mllib_${scala.binary.version} + ${spark.version} + + + + \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/AutoConf.scala similarity index 86% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/AutoConf.scala index 31e10c842..7c233086d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/AutoConf.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/AutoConf.scala @@ -16,12 +16,18 @@ */ -package com.tencent.angel.spark.ml.automl +package com.tencent.angel.spark.automl object AutoConf { object Preprocess { + val ML_DATA_INPUT_FORMAT = "ml.data.format" + val DEFAULT_ML_DATA_INPUT_FORMAT = "libsvm" + + val ML_DATA_SPLITOR = "ml.data.splitor" + val DEFAULT_ML_DATA_SPLITOR = "\\s+" + val INPUT_TYPE = "ml.input.type" val DEFAULT_INPUT_TYPE = "normal" diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala similarity index 98% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala index 7c73f8da5..b2269187b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/DataLoader.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.automl.feature import org.apache.spark.sql.{DataFrame, SparkSession} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/InToOutRelation.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/InToOutRelation.scala index baa129397..5f6a4ab7a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/InToOutRelation.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/InToOutRelation.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.automl.feature object InToOutRelation extends Enumeration { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala index 589d00173..ad904033f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineBuilder.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.automl.feature import org.apache.spark.SparkException import org.apache.spark.ml.PipelineStage diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala index 56f08926e..887640f3b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.automl.feature import org.apache.spark.ml.Transformer -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InToOutRelation +import com.tencent.angel.spark.automl.feature.InToOutRelation.InToOutRelation abstract class TransformerWrapper { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala index ac1e0f8ff..72d410344 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/cross/FeatureCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature.cross +package com.tencent.angel.spark.automl.feature.cross import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala index dda3335b3..e9701a67c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Components.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess import org.apache.spark.ml.PipelineStage import org.apache.spark.ml.feature.{StopWordsRemover, Tokenizer} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala similarity index 79% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala index 7278fbcb1..d2d47d376 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala @@ -16,12 +16,12 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess -import com.tencent.angel.ml.core.conf.MLConf -import com.tencent.angel.spark.ml.automl.AutoConf -import com.tencent.angel.spark.ml.automl.feature.DataLoader -import com.tencent.angel.spark.ml.core.ArgsUtil +//import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.spark.automl.AutoConf +import com.tencent.angel.spark.automl.feature.DataLoader +import com.tencent.angel.spark.automl.utils.ArgsUtil import org.apache.spark.ml.{Pipeline, PipelineStage} import org.apache.spark.sql.SparkSession @@ -36,15 +36,14 @@ object FPreprocess { val master = params.getOrElse("master", "yarn") val deploy = params.getOrElse("deploy-mode", "cluster") val input = params.getOrElse("input", "") - val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, - MLConf.DEFAULT_ML_DATA_SPLITOR) - val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, - MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) + val inputSeparator = params.getOrElse(AutoConf.Preprocess.ML_DATA_SPLITOR, + AutoConf.Preprocess.DEFAULT_ML_DATA_SPLITOR) + val inputFormat = params.getOrElse(AutoConf.Preprocess.ML_DATA_INPUT_FORMAT, + AutoConf.Preprocess.DEFAULT_ML_DATA_INPUT_FORMAT) val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, AutoConf.Preprocess.DEFAULT_INPUT_TYPE) val sampleRate = params.getOrElse(AutoConf.Preprocess.SAMPLE_RATE, - AutoConf.Preprocess.DEFAULT_SAMPLE_RATE - ).toDouble + AutoConf.Preprocess.DEFAULT_SAMPLE_RATE).toDouble val imbalanceSampleRate = params.getOrElse(AutoConf.Preprocess.IMBALANCE_SAMPLE, AutoConf.Preprocess.DEFAULT_IMBALANCE_SAMPLE) val hasTokenizer = if (inputFormat.equals("document")) true else false diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala index 2356e9ea8..849958f35 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/Sampler.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess import org.apache.spark.ml.linalg.Vector import org.apache.spark.ml.{Pipeline, Transformer} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/SamplerWrapper.scala similarity index 83% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/SamplerWrapper.scala index dc52e14f3..7e8bdc2a2 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/SamplerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/SamplerWrapper.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InToOutRelation -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.InPlace -import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import com.tencent.angel.spark.automl.feature.InToOutRelation.InToOutRelation +import com.tencent.angel.spark.automl.feature.InToOutRelation.InPlace +import com.tencent.angel.spark.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer class SamplerWrapper(fraction: Double) extends TransformerWrapper { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala similarity index 87% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala index 51f2ab1ca..d4330aa87 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StopWordsRemoverWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -15,10 +15,10 @@ * */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} -import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer import org.apache.spark.ml.feature.StopWordsRemover diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala index cec5f841a..055abb173 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TPreprocess.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala similarity index 87% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala index f8e88b35f..26c2c1464 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/TokenizerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.feature.preprocess +package com.tencent.angel.spark.automl.feature.preprocess -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} -import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper import org.apache.spark.ml.Transformer import org.apache.spark.ml.feature.Tokenizer diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala index 86f6d0c33..3efcd6576 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/select/FeatureSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.feature.select +package com.tencent.angel.spark.automl.feature.select import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala similarity index 77% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala index 10d501193..2c33df3e7 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/transform/FTransform.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.feature.transform +package com.tencent.angel.spark.automl.feature.transform -import com.tencent.angel.ml.core.conf.MLConf -import com.tencent.angel.spark.ml.automl.AutoConf -import com.tencent.angel.spark.ml.core.ArgsUtil +//import com.tencent.angel.ml.core.conf.MLConf +import com.tencent.angel.spark.automl.AutoConf +import com.tencent.angel.spark.automl.utils.ArgsUtil class FTransform { @@ -29,10 +29,10 @@ class FTransform { val master = params.getOrElse("master", "yarn") val deploy = params.getOrElse("deploy-mode", "cluster") val input = params.getOrElse("input", "") - val inputSeparator = params.getOrElse(MLConf.ML_DATA_SPLITOR, - MLConf.DEFAULT_ML_DATA_SPLITOR) - val inputFormat = params.getOrElse(MLConf.ML_DATA_INPUT_FORMAT, - MLConf.DEFAULT_ML_DATA_INPUT_FORMAT) + val inputSeparator = params.getOrElse(AutoConf.Preprocess.ML_DATA_SPLITOR, + AutoConf.Preprocess.DEFAULT_ML_DATA_SPLITOR) + val inputFormat = params.getOrElse(AutoConf.Preprocess.ML_DATA_INPUT_FORMAT, + AutoConf.Preprocess.DEFAULT_ML_DATA_INPUT_FORMAT) val inputType = params.getOrElse(AutoConf.Preprocess.INPUT_TYPE, AutoConf.Preprocess.DEFAULT_INPUT_TYPE) val hasDiscreter = params.getOrElse(AutoConf.Preprocess.HAS_DISCRETER, diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala similarity index 70% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 4226f2758..0927f247d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -16,28 +16,26 @@ */ -package com.tencent.angel.spark.ml.automl.tuner +package com.tencent.angel.spark.automl.tuner -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, Surrogate} -import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace} +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace import org.apache.spark.ml.linalg.Vector object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10,100") val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,100") val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() - (0 until 20).foreach{ iter => + (0 until 1000).foreach{ iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala similarity index 75% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala index 6db1e3a79..e6cdbc4ff 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/RFTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala @@ -16,15 +16,15 @@ */ -package com.tencent.angel.spark.ml.automl.tuner +package com.tencent.angel.spark.automl.tuner -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace -import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.ml.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.{RFSurrogate, Surrogate} -import com.tencent.angel.spark.ml.automl.tuner.trail.{TestTrail, Trail} +import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.automl.tuner.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector object RFTunerExample extends App { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala similarity index 88% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala index feb8f97cd..a3bb5e05f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/TunerParam.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner +package com.tencent.angel.spark.automl.tuner class TunerParam { } @@ -26,7 +26,7 @@ object TunerParam { var batchSize: Int = 1 var sampleSize: Int = 10 * batchSize - var taskName: String = "com.tencent.angel.spark.ml.automl.tuner.trail.TestRunner" + var taskName: String = "com.tencent.angel.spark.automl.tuner.trail.TestRunner" def setBatchSize(num: Int): Unit = { batchSize = num diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/Acquisition.scala similarity index 90% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/Acquisition.scala index 413fdb0bc..a7b699d1d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/Acquisition.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/Acquisition.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition +package com.tencent.angel.spark.automl.tuner.acquisition import org.apache.spark.ml.linalg.Vector -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate +import com.tencent.angel.spark.automl.tuner.surrogate.Surrogate /** diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala similarity index 87% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala index a21288029..cd5c4b4e3 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala @@ -16,13 +16,14 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition +package com.tencent.angel.spark.automl.tuner.acquisition import org.apache.spark.ml.linalg.{Vector, Vectors} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.Surrogate import org.apache.commons.logging.{Log, LogFactory} import org.apache.commons.math3.distribution.NormalDistribution +import com.tencent.angel.spark.automl.tuner.surrogate.Surrogate + /** * Expected improvement. * @param surrogate @@ -45,6 +46,7 @@ class EI( val m: Double = pred._1 val s: Double = Math.sqrt(pred._2) + //println(s"${X.toArray.mkString("(", ",", ")")}: mean[$m], variance[$s]") if (s == 0) { // if std is zero, we have observed x on all instances @@ -56,7 +58,7 @@ class EI( val cdf: Double = norm.cumulativeProbability(z) val pdf: Double = norm.density(z) val ei = s * (z * cdf + pdf) - //println(s"EI of ${X.toArray.mkString("(", ",", ")")}: $ei, cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf") + println(s"EI of ${X.toArray.mkString("(", ",", ")")}: $ei, cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf") (ei, Vectors.dense(new Array[Double](X.size))) } } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala similarity index 85% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index 6ba321d3a..1cba8d9a8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.spark.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration,ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.automl.tuner.config.{Configuration,ConfigurationSpace} /** * Abstract base class for acquisition maximization. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/LocalSearch.scala similarity index 89% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/LocalSearch.scala index c3ea21589..d61ede1e6 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/LocalSearch.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/LocalSearch.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.spark.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} /** * Implementation of local search. diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala similarity index 88% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala index 84afbdec5..970f0df2f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer +package com.tencent.angel.spark.automl.tuner.acquisition.optimizer -import com.tencent.angel.spark.ml.automl.tuner.TunerParam -import com.tencent.angel.spark.ml.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.TunerParam +import com.tencent.angel.spark.automl.tuner.acquisition.Acquisition +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import org.apache.commons.logging.{Log, LogFactory} import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/Configuration.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/Configuration.scala index 03dcf3568..3461ab01f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/Configuration.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/Configuration.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.config +package com.tencent.angel.spark.automl.tuner.config import org.apache.spark.ml.linalg.Vector import org.apache.spark.ml.param._ diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala similarity index 93% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 61c399ec1..a12668417 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -16,16 +16,15 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.config +package com.tencent.angel.spark.automl.tuner.config -import scala.collection.mutable.HashSet -import org.apache.spark.ml.linalg.{Vector, Vectors} -import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace -import com.tencent.angel.spark.ml.automl.utils.AutoMLException +import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.ml.linalg.{Vector, Vectors} import org.apache.spark.sql.types._ -import scala.collection.mutable.ArrayBuffer +import scala.collection.mutable.{ArrayBuffer, HashSet} class ConfigurationSpace( val name: String, diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CoVariance.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CoVariance.scala index 633011877..199572f86 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CoVariance.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CoVariance.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala index 29191acd4..190fe3d17 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/CovarianceType.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel object CovarianceType extends Enumeration { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala index 6b9a0a515..99257492a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern3.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala @@ -16,11 +16,12 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} +import breeze.linalg._ import breeze.numerics.{exp, pow, sqrt} -import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import com.tencent.angel.spark.automl.tuner.math.SquareDist /** * Matern covariance function with v = 3/2 diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala index d74da88e6..933d0213f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.numerics._ -import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import com.tencent.angel.spark.automl.tuner.math.SquareDist /** * Matern covariance function with v = 5/2 diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala index 565c3ac46..6f26acfd0 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/Matern5Iso.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.numerics._ -import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import com.tencent.angel.spark.automl.tuner.math.SquareDist /** * Matern covariance function with v = 5/2 and isotropic distance measure diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala similarity index 93% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala index 58b3a7971..b42269303 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/kernel/SquareExpIso.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala @@ -1,8 +1,8 @@ -package com.tencent.angel.spark.ml.automl.tuner.kernel +package com.tencent.angel.spark.automl.tuner.kernel import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.numerics._ -import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import com.tencent.angel.spark.automl.tuner.math.SquareDist /** * Square exponential covariance function with isotropic distance measure diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala index 668642638..e930c2418 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/BreezeOp.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.math +package com.tencent.angel.spark.automl.tuner.math import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import breeze.linalg.{cholesky, diag, inv, sum, trace} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala similarity index 91% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala index 24fd56c4c..08898f04f 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/math/SquareDist.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala @@ -16,10 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.math +package com.tencent.angel.spark.automl.tuner.math import breeze.generic.UFunc -import breeze.linalg.{DenseMatrix => BDM, _} +import breeze.linalg.{DenseMatrix => BDM} +import breeze.linalg._ /** * Computes pair-wise square distances between matrices x1 and x2. @@ -43,4 +44,4 @@ object SquareDist extends UFunc { t2(::, *) + sum(x1.t *:* x1.t, Axis._0).t } } -} +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala similarity index 91% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala index 6f4d82bdc..412bd58c8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala @@ -16,17 +16,15 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.model +package com.tencent.angel.spark.automl.tuner.model import breeze.linalg.{DenseMatrix, DenseVector} -import com.tencent.angel.spark.ml.automl.tuner.kernel.Matern5Iso +import com.tencent.angel.spark.automl.tuner.kernel.Matern5Iso object GPExample { def main(args: Array[String]): Unit = { - println(Double.getClass.getSimpleName) - val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t @@ -47,7 +45,7 @@ object GPExample { //val covFunc = SquareExpIso() val covFunc = Matern5Iso() val initCovParams = DenseVector(1.0,1.0) - val initNoiseStdDev = 0.1 + val initNoiseStdDev = 0.01 val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala similarity index 89% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala index d0c67723c..aabf2e790 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPKernelDiffFunc.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.model +package com.tencent.angel.spark.automl.tuner.model -import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV, MatrixNotSymmetricException, NotConvergedException} +import breeze.linalg.{MatrixNotSymmetricException, NotConvergedException, DenseMatrix => BDM, DenseVector => BDV} import breeze.optimize.DiffFunction -import com.tencent.angel.spark.ml.automl.tuner.math.BreezeOp +import com.tencent.angel.spark.automl.tuner.math.BreezeOp class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { @@ -50,7 +50,7 @@ class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { //println("true inverse of KXX:") //println(inv(KXX)) - val loglikeLoss = - BreezeOp.logLike(meanX, KXX, invKXX, model.y) + val loglikeLoss = -BreezeOp.logLike(meanX, KXX, invKXX, model.y) //println(s"log likelihood loss: $loglikeLoss") // calculate partial derivatives diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala similarity index 91% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 644269b43..9e37f7f11 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -16,13 +16,12 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.model +package com.tencent.angel.spark.automl.tuner.model import breeze.linalg.{cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} import breeze.optimize.LBFGS -import com.tencent.angel.spark.ml.automl.tuner.kernel.{Covariance, CovarianceType} -import com.tencent.angel.spark.ml.automl.tuner.math.BreezeOp -import org.apache.spark.ml.linalg.DenseMatrix +import com.tencent.angel.spark.automl.tuner.kernel.{Covariance, CovarianceType} +import com.tencent.angel.spark.automl.tuner.math.BreezeOp import scala.math._ @@ -49,7 +48,7 @@ class GPModel(val covFunc: Covariance, val kernelDiffFunc = new GPKernelDiffFunc(this) val initParams = BDV(covParams.toArray :+ noiseStdDev) - val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 3, tolerance = 0.1) + val optimizer = new LBFGS[BDV[Double]](maxIter = 20, m = 7, tolerance = 0.1) val newParams = optimizer.minimize(kernelDiffFunc, initParams) //println(optimizer) //println(s"new params: ${newParams}") @@ -86,7 +85,7 @@ class GPModel(val covFunc: Covariance, val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map{ v => - if (v < -1e-12) 0 else v + if (v < -1e-12 | v.isNaN | v.isInfinite) 0 else v } BDV.horzcat(predMean, predVar) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 26067cd49..ee6914779 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -16,9 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.spark.automl.tuner.parameter -import com.tencent.angel.spark.ml.automl.utils.{AutoMLException, Distribution} + +import com.tencent.angel.spark.automl.utils.{AutoMLException, Distribution} import scala.collection.mutable.ArrayBuffer import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index d3d00ca00..96d2cdcb2 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -16,9 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.spark.automl.tuner.parameter -import com.tencent.angel.spark.ml.automl.utils.AutoMLException + +import com.tencent.angel.spark.automl.utils.AutoMLException import scala.reflect.ClassTag import scala.util.Random diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala similarity index 94% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index 205cf437f..03a838ca5 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.parameter +package com.tencent.angel.spark.automl.tuner.parameter import scala.reflect.ClassTag diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala similarity index 87% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index a567ef09f..588bae3d4 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -16,15 +16,16 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.solver - -import com.tencent.angel.spark.ml.automl.tuner.TunerParam -import com.tencent.angel.spark.ml.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.ml.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.ml.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.ml.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.ml.automl.tuner.surrogate.{GPSurrogate, Surrogate} -import com.tencent.angel.spark.ml.automl.utils.AutoMLException +package com.tencent.angel.spark.automl.tuner.solver + + +import com.tencent.angel.spark.automl.tuner.TunerParam +import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.surrogate.{GPSurrogate, Surrogate} +import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala similarity index 89% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala index 976f36fcc..310e6b362 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.solver +package com.tencent.angel.spark.automl.tuner.solver -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration -import com.tencent.angel.spark.ml.automl.tuner.trail.Trail +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.trail.Trail import org.apache.spark.ml.linalg.Vector class SolverWithTrail(val solver: Solver, val trail: Trail) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala similarity index 83% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala index 1f0e8b251..63e20c4cc 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala @@ -16,14 +16,14 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.surrogate +package com.tencent.angel.spark.automl.tuner.surrogate import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV} import org.apache.spark.ml.linalg.Vector -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace -import com.tencent.angel.spark.ml.automl.tuner.kernel.Matern5Iso -import com.tencent.angel.spark.ml.automl.tuner.model.GPModel -import com.tencent.angel.spark.ml.automl.utils.DataUtils +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.automl.tuner.kernel.Matern5Iso +import com.tencent.angel.spark.automl.tuner.model.GPModel +import com.tencent.angel.spark.automl.utils.DataUtils import org.apache.commons.logging.{Log, LogFactory} class GPSurrogate( @@ -65,7 +65,7 @@ class GPSurrogate( val pred = gpModel.predict(breezeX) - //println(s"predict of ${X.toArray.mkString(",")}: mean[${pred(0, 0)}] variance[${pred(0, 1)}]") + println(s"predict of ${X.toArray.mkString(",")}: mean[${pred(0, 0)}] variance[${pred(0, 1)}]") (pred(0, 0), pred(0, 1)) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala similarity index 93% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala index 1c8c3e1ad..291d95e40 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.surrogate +package com.tencent.angel.spark.automl.tuner.surrogate -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace import org.apache.spark.ml.linalg.Vector -import com.tencent.angel.spark.ml.automl.utils.DataUtils +import com.tencent.angel.spark.automl.utils.DataUtils import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.ml.regression.{DecisionTreeRegressionModel, RandomForestRegressionModel, RandomForestRegressor} import org.apache.spark.sql.{DataFrame, SparkSession} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala similarity index 96% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala index 33a6ce102..5cdb3d681 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala @@ -16,9 +16,9 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.surrogate +package com.tencent.angel.spark.automl.tuner.surrogate -import com.tencent.angel.spark.ml.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.sql.types.{DataTypes, StructField, StructType} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala similarity index 84% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala index b1f525419..78010afee 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestRunner.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.spark.automl.tuner.trail -import com.github.fommil.netlib.{BLAS => NetlibBLAS, F2jBLAS} -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.github.fommil.netlib.{F2jBLAS, BLAS => NetlibBLAS} +import com.tencent.angel.spark.automl.tuner.config.Configuration class TestRunner(config: Configuration) extends TrailRunner(config) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestTrail.scala similarity index 90% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestTrail.scala index a8872aa3d..1919eb1cd 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TestTrail.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestTrail.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.spark.automl.tuner.trail import com.github.fommil.netlib.{BLAS => NetlibBLAS, F2jBLAS} -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.config.Configuration class TestTrail extends Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/Trail.scala similarity index 87% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/Trail.scala index a1d291a32..af8b2e30c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/Trail.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/Trail.scala @@ -16,9 +16,9 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.spark.automl.tuner.trail -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.config.Configuration abstract class Trail { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala similarity index 88% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala index b9d998321..0cf780c5c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/tuner/trail/TrailRunner.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala @@ -16,11 +16,11 @@ */ -package com.tencent.angel.spark.ml.automl.tuner.trail +package com.tencent.angel.spark.automl.tuner.trail import java.util.concurrent.Callable -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.config.Configuration abstract class TrailRunner(var config: Configuration) extends Callable[Double]{ diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/ArgsUtil.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/ArgsUtil.scala new file mode 100644 index 000000000..af945e085 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/ArgsUtil.scala @@ -0,0 +1,41 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.utils + +import scala.collection.mutable + +object ArgsUtil { + + def parse(args: Array[String]): Map[String, String] = { + val cmdArgs = new mutable.HashMap[String, String]() + println("parsing parameter") + for (arg <- args) { + val sepIdx = arg.indexOf(":") + if (sepIdx != -1) { + val k = arg.substring(0, sepIdx).trim + val v = arg.substring(sepIdx + 1).trim + if (v != "" && v != "Nan" && v != null) { + cmdArgs.put(k, v) + println(s"param $k = $v") + } + } + } + cmdArgs.toMap + } +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/AutoMLException.scala similarity index 55% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/AutoMLException.scala index 82309ab90..6e90f315e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/AutoMLException.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/AutoMLException.scala @@ -1,3 +1,3 @@ -package com.tencent.angel.spark.ml.automl.utils +package com.tencent.angel.spark.automl.utils class AutoMLException(msg: String) extends Exception(msg) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/DataUtils.scala similarity index 97% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/DataUtils.scala index 302c2ca93..dbc72dfeb 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/DataUtils.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/DataUtils.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.utils +package com.tencent.angel.spark.automl.utils import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector} import org.apache.spark.sql.SparkSession diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/Distribution.scala similarity index 95% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/Distribution.scala index fda53d886..82cf74750 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/utils/Distribution.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/utils/Distribution.scala @@ -16,7 +16,7 @@ */ -package com.tencent.angel.spark.ml.automl.utils +package com.tencent.angel.spark.automl.utils object Distribution extends Enumeration { diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/GPModelTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/GPModelTest.scala new file mode 100644 index 000000000..3afb3e298 --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/GPModelTest.scala @@ -0,0 +1,91 @@ +package com.tencent.angel.spark.automl + +import breeze.linalg.{DenseMatrix, DenseVector} +import breeze.numerics.{cos, pow} +import com.tencent.angel.spark.automl.tuner.kernel.Matern5Iso +import com.tencent.angel.spark.automl.tuner.model.GPModel +import org.junit._ + +class GPModelTest { + + @Test def testLinear(): Unit = { + // Test linear: y=2*x + val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) + val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t + val truePredZ = 2.0 * DenseVector(2.5,4.5,6.5,8.5,10.0,12.0) + + val covFunc = Matern5Iso() + val initCovParams = DenseVector(1.0,1.0) + val initNoiseStdDev = 0.01 + + val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) + gpModel.fit(X, y) + + println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n") + + val prediction = gpModel.predict(z) + println("Mean and Var:") + println(prediction) + println("True value:") + println(truePredZ) + } + + @Test def testCosine(): Unit = { + // Test no_linear: y=cos(x)+1 + val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + val y = cos(DenseVector(1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0))+1.0 + val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + val truePredZ = cos(DenseVector(2.5, 4.5,6.5,8.5,10.0,12.0))+1.01 + + val covFunc = Matern5Iso() + val initCovParams = DenseVector(1.0,1.0) + val initNoiseStdDev = 0.01 + + val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) + gpModel.fit(X, y) + + println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n") + + val prediction = gpModel.predict(z) + println("Mean and Var:") + println(prediction) + println("True value:") + println(truePredZ) + } + + @Test def testSquare(): Unit = { + // Test no_linear: y=x^2 + val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + val y = DenseVector(1.0,4.0, 9.0,16.0,25.0,36.0,49.0,64.0,81.0) + val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + val truePredZ = pow(z,2) + + val covFunc = Matern5Iso() + val initCovParams = DenseVector(1.0,1.0) + val initNoiseStdDev = 0.01 + + val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) + gpModel.fit(X, y) + + println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n") + + val prediction = gpModel.predict(z) + println("Mean and Var:") + println(prediction) + println("True value:") + println(truePredZ) + } +} diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/SquareDistTest.scala similarity index 94% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala rename to spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/SquareDistTest.scala index 590246068..9d81efcb9 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/math/SquareDistTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/SquareDistTest.scala @@ -16,10 +16,10 @@ */ -package com.tencent.angel.spark.ml.math +package com.tencent.angel.spark.automl import breeze.linalg.{DenseMatrix, DenseVector} -import com.tencent.angel.spark.ml.automl.tuner.math.SquareDist +import com.tencent.angel.spark.automl.tuner.math.SquareDist import org.junit.Assert._ import org.junit._ diff --git a/spark-on-angel/mllib/pom.xml b/spark-on-angel/mllib/pom.xml index 5f97be047..6f7fdae89 100644 --- a/spark-on-angel/mllib/pom.xml +++ b/spark-on-angel/mllib/pom.xml @@ -23,6 +23,11 @@ spark-on-angel-core ${project.version} + + com.tencent.angel + spark-on-angel-automl + ${project.version} + com.tencent.angel angel-ps-mllib diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 38af55581..b4d5f6922 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -23,10 +23,10 @@ import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext -import com.tencent.angel.spark.ml.automl.tuner.config.Configuration -import com.tencent.angel.spark.ml.automl.tuner.parameter.ParamSpace -import com.tencent.angel.spark.ml.automl.tuner.solver.Solver -import com.tencent.angel.spark.ml.automl.utils.AutoMLException +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.utils.AutoMLException import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} import org.apache.spark.SparkContext diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala index aa1867040..c049a6681 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala @@ -5,7 +5,7 @@ import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression -import com.tencent.angel.spark.ml.core.{AutoOfflineLearner, OfflineLearner} +import com.tencent.angel.spark.ml.core.AutoOfflineLearner class AutoLRTest extends PSFunSuite with SharedPSContext { private var learner: AutoOfflineLearner = _ diff --git a/spark-on-angel/pom.xml b/spark-on-angel/pom.xml index 1f6b2ff83..65c35a01a 100644 --- a/spark-on-angel/pom.xml +++ b/spark-on-angel/pom.xml @@ -34,6 +34,7 @@ core mllib examples + automl From 245b443ef2d238d2990fb4bbb4231fff5ac98044 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 4 Jan 2019 14:17:28 +0800 Subject: [PATCH 056/115] rm useless import --- .../angel/spark/automl/feature/preprocess/FPreprocess.scala | 1 - .../angel/spark/automl/feature/transform/FTransform.scala | 1 - 2 files changed, 2 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala index d2d47d376..f6dfd09e1 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.feature.preprocess -//import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.spark.automl.AutoConf import com.tencent.angel.spark.automl.feature.DataLoader import com.tencent.angel.spark.automl.utils.ArgsUtil diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala index 2c33df3e7..e7f270cb4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/transform/FTransform.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.feature.transform -//import com.tencent.angel.ml.core.conf.MLConf import com.tencent.angel.spark.automl.AutoConf import com.tencent.angel.spark.automl.utils.ArgsUtil From c3572bb50681f930b8dd1b0f6e46b6fd0a129752 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 4 Jan 2019 15:31:29 +0800 Subject: [PATCH 057/115] automl examples --- .../spark/automl/tuner/GPTunerExample.scala | 6 +- .../spark/automl/tuner/RFTunerExample.scala | 2 - .../{CoVariance.scala => Covariance.scala} | 0 .../spark/examples/automl/GPExample.scala | 69 +++++++++++++++++++ .../examples/automl/GPTunerExample.scala | 47 +++++++++++++ .../examples/automl/RFTunerExample.scala | 52 ++++++++++++++ .../spark/ml/core/AutoOfflineLearner.scala | 3 +- .../tencent/angel/spark/ml/AutoLRTest.scala | 2 +- 8 files changed, 173 insertions(+), 8 deletions(-) rename spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/{CoVariance.scala => Covariance.scala} (100%) create mode 100644 spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPExample.scala create mode 100644 spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala create mode 100644 spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 0927f247d..53ae79e6f 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -29,13 +29,13 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10,100") - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,100") + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() - (0 until 1000).foreach{ iter => + (0 until 100).foreach{ iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala index e6cdbc4ff..e8447b012 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala @@ -39,8 +39,6 @@ object RFTunerExample extends App { cs.addParam(param2) cs.addParam(param3) cs.addParam(param4) - TunerParam.setBatchSize(1) - TunerParam.setSampleSize(100) val sur: Surrogate = new RFSurrogate(cs, true) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CoVariance.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala similarity index 100% rename from spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CoVariance.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPExample.scala new file mode 100644 index 000000000..4907d457e --- /dev/null +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPExample.scala @@ -0,0 +1,69 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.examples.automl + +import breeze.linalg.{DenseMatrix, DenseVector} +import com.tencent.angel.spark.automl.tuner.kernel.Matern5Iso +import com.tencent.angel.spark.automl.tuner.model.GPModel + +object GPExample { + + def main(args: Array[String]): Unit = { + + // 1.Test linear(y=2*x) + val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) + val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t + val truePredZ = 2.0 * DenseVector(2.5,4.5,6.5,8.5,10.0,12.0) + + // // 2.Test no_linear(y=cos(x)+1) + // val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + // val y = cos(DenseVector(1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0))+1.0 + // val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + // val truePredZ = cos(DenseVector(2.5, 4.5,6.5,8.5,10.0,12.0))+1.0 + + // // 3.Test no_linear(y=x^2) + // val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t + // val y = DenseVector(1.0,4.0, 9.0,16.0,25.0,36.0,49.0,64.0,81.0) + // val z = DenseMatrix((2.5, 4.5,6.5,8.5,10.0,12.0)).t + // val truePredZ = pow(z,2) + + //val covFunc = SquareExpIso() + val covFunc = Matern5Iso() + val initCovParams = DenseVector(1.0,1.0) + val initNoiseStdDev = 0.01 + + val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) + + gpModel.fit(X, y) + + println("Fitted covariance function params:") + println(gpModel.covParams) + println("Fitted noiseStdDev:") + println(gpModel.noiseStdDev) + println("\n") + + val prediction = gpModel.predict(z) + println("Mean and Var:") + println(prediction) + println("True value:") + println(truePredZ) + } + +} diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala new file mode 100644 index 000000000..24dc7e159 --- /dev/null +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala @@ -0,0 +1,47 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.examples.automl + +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector + +object GPTunerExample extends App { + + override def main(args: Array[String]): Unit = { + + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") + val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true) + val trail: Trail = new TestTrail() + (0 until 100).foreach{ iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } +} diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala new file mode 100644 index 000000000..9904995a6 --- /dev/null +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala @@ -0,0 +1,52 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.examples.automl + +import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} +import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.solver.{Solver, SolverWithTrail} +import com.tencent.angel.spark.automl.tuner.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector + +object RFTunerExample extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + val sur: Surrogate = new RFSurrogate(cs, true) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + val solver: Solver = new Solver(cs, sur, acq, opt) + val trail: Trail = new TestTrail() + val runner: SolverWithTrail = new SolverWithTrail(solver, trail) + val result: (Vector, Double) = runner.run(10) + sur.stop() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index b4d5f6922..10a1e981a 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -37,7 +37,7 @@ import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner(minimize: Boolean) { +class AutoOfflineLearner(var tunIter = 20, minimize: Boolean = true) { // Shared configuration with Angel-PS val conf = SharedConf.get() @@ -46,7 +46,6 @@ class AutoOfflineLearner(minimize: Boolean) { var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) var validationRatio: Double = conf.getDouble(MLConf.ML_VALIDATE_RATIO) - var tuneIter: Int = 20 println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala index c049a6681..fac0363bf 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala @@ -33,7 +33,7 @@ class AutoLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(false) + learner = new AutoOfflineLearner(10,false) learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100") } From 582beef997f23dfce029f107915b81d6ac9636fc Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 4 Jan 2019 15:35:29 +0800 Subject: [PATCH 058/115] rm debug log --- .../com/tencent/angel/spark/automl/tuner/acquisition/EI.scala | 2 +- .../angel/spark/automl/tuner/surrogate/GPSurrogate.scala | 2 +- .../com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala | 2 +- .../src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala index cd5c4b4e3..e6ecef75d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala @@ -58,7 +58,7 @@ class EI( val cdf: Double = norm.cumulativeProbability(z) val pdf: Double = norm.density(z) val ei = s * (z * cdf + pdf) - println(s"EI of ${X.toArray.mkString("(", ",", ")")}: $ei, cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf") + //println(s"EI of ${X.toArray.mkString("(", ",", ")")}: $ei, cur best: $eta, z: $z, cdf: $cdf, pdf: $pdf") (ei, Vectors.dense(new Array[Double](X.size))) } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala index 63e20c4cc..7083cfe22 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala @@ -65,7 +65,7 @@ class GPSurrogate( val pred = gpModel.predict(breezeX) - println(s"predict of ${X.toArray.mkString(",")}: mean[${pred(0, 0)}] variance[${pred(0, 1)}]") + //println(s"predict of ${X.toArray.mkString(",")}: mean[${pred(0, 0)}] variance[${pred(0, 1)}]") (pred(0, 0), pred(0, 1)) } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 10a1e981a..46bbf4b7c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -37,7 +37,7 @@ import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner(var tunIter = 20, minimize: Boolean = true) { +class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { // Shared configuration with Angel-PS val conf = SharedConf.get() diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala index fac0363bf..1ece77014 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala @@ -33,7 +33,7 @@ class AutoLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(10,false) + learner = new AutoOfflineLearner(5,false) learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100") } From d9e9cc2f78dd1372fe275b854619469c041fadf5 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 4 Jan 2019 15:37:18 +0800 Subject: [PATCH 059/115] revise pom --- spark-on-angel/examples/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spark-on-angel/examples/pom.xml b/spark-on-angel/examples/pom.xml index 4fdfc9154..ce3aec210 100644 --- a/spark-on-angel/examples/pom.xml +++ b/spark-on-angel/examples/pom.xml @@ -47,6 +47,12 @@ ${project.version} ${dist.deps.scope} + + com.tencent.angel + spark-on-angel-automl + ${project.version} + ${dist.deps.scope} + com.tencent.angel angel-ps-mllib From bfe87e5b4816869cee1ac5ffeb636a3894585b90 Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Fri, 4 Jan 2019 15:41:47 +0800 Subject: [PATCH 060/115] create PipelineWrapper and PipelineDriver --- .../spark/automl/feature/PipelineDriver.scala | 49 ++++++++++++++++++ .../automl/feature/PipelineWrapper.scala | 18 +++++++ .../automl/feature/TransformerWrapper.scala | 7 ++- .../automl/feature/UserProfileLoader.scala | 9 ++-- .../preprocess/MinMaxScalerWrapper.scala | 46 +++++++++++++++++ .../preprocess/StandardScalerWrapper.scala | 45 +++++++++++++++++ .../preprocess/StopWordsRemoverWrapper.scala | 1 - .../ml/automl/feature/PipelineDriver.scala | 18 ------- .../ml/automl/feature/PipelineWrapper.scala | 27 ---------- .../preprocess/MinMaxScalerWrapper.scala | 50 ------------------- .../preprocess/StandardScalerWrapper.scala | 48 ------------------ 11 files changed, 165 insertions(+), 153 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala rename spark-on-angel/{mllib/src/main/scala/com/tencent/angel/spark/ml => automl/src/main/scala/com/tencent/angel/spark}/automl/feature/UserProfileLoader.scala (64%) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala new file mode 100644 index 000000000..d8c097812 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala @@ -0,0 +1,49 @@ +package com.tencent.angel.spark.automl.feature + +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import com.tencent.angel.spark.automl.feature.preprocess.{MinMaxScalerWrapper, StandardScalerWrapper} +import org.apache.spark.ml.PipelineModel +import org.apache.spark.ml.linalg.Vectors +import org.apache.spark.sql.SparkSession + +object PipelineDriver { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + +// val inputDF = spark.createDataFrame(Seq( +// (0L, "a b c d e spark", 1.0), +// (1L, "b d", 0.0), +// (2L, "spark f g h", 1.0), +// (3L, "hadoop mapreduce", 0.0) +// )).toDF("id", "text", "label") + + val inputDF = spark.createDataFrame(Seq( + (0, Vectors.dense(1.0, 0.1, -1.0)), + (1, Vectors.dense(2.0, 1.1, 1.0)), + (2, Vectors.dense(3.0, 10.1, 3.0)) + )).toDF("id", "numerical") + + val pipelineWrapper = new PipelineWrapper() + + val transformers = Array[TransformerWrapper]( + new MinMaxScalerWrapper(), + new StandardScalerWrapper() + ) + + val stages = PipelineBuilder.build(transformers) + + print(transformers(0).getInputCols) + + pipelineWrapper.setStages(stages) + + val model: PipelineModel = pipelineWrapper.fit(inputDF) + + val outDF = model.transform(inputDF) + + outDF.show() + + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala new file mode 100644 index 000000000..19ff7df38 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala @@ -0,0 +1,18 @@ +package com.tencent.angel.spark.automl.feature + +import org.apache.spark.ml.{Pipeline, PipelineModel, PipelineStage} +import org.apache.spark.sql.Dataset + +class PipelineWrapper() { + + var pipeline = new Pipeline() + + def setStages(value: Array[_ <: PipelineStage]): Unit = { + pipeline = pipeline.setStages(value) + } + + def fit(dataset: Dataset[_]): PipelineModel = { + pipeline.fit(dataset) + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala index fadfdc7a2..eefe5fd88 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala @@ -18,12 +18,12 @@ package com.tencent.angel.spark.automl.feature -import org.apache.spark.ml.Transformer +import org.apache.spark.ml.{PipelineStage, Transformer} import com.tencent.angel.spark.automl.feature.InToOutRelation.InToOutRelation abstract class TransformerWrapper { - var transformer: Transformer + val transformer: PipelineStage var parent: TransformerWrapper val relation: InToOutRelation @@ -31,7 +31,6 @@ abstract class TransformerWrapper { val hasMultiInputs: Boolean val hasMultiOutputs: Boolean val needAncestorInputs: Boolean - val needFit: Boolean private val prefix = "out_" val requiredInputCols: Array[String] @@ -42,7 +41,7 @@ abstract class TransformerWrapper { private var ancestorCols: Array[String] = _ - def getTransformer: Transformer = transformer + def getTransformer = transformer def setParent(parent: TransformerWrapper): Unit = this.parent = parent diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/UserProfileLoader.scala similarity index 64% rename from spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/UserProfileLoader.scala index 03dfa50b9..927d0ec1e 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/UserProfileLoader.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/UserProfileLoader.scala @@ -1,6 +1,6 @@ -package com.tencent.angel.spark.ml.automl.feature +package com.tencent.angel.spark.automl.feature -import com.tencent.angel.spark.ml.automl.feature.preprocess.{SamplerWrapper, StopWordsRemoverWrapper, TokenizerWrapper} +import com.tencent.angel.spark.automl.feature.preprocess._ import scala.collection.mutable.ArrayBuffer @@ -13,10 +13,9 @@ class UserProfileLoader { case "SamplerWrapper" => new SamplerWrapper(0.5) case "StopWordsRemoverWrapper" => new StopWordsRemoverWrapper() case "Tokenizer" => new TokenizerWrapper() + case "MinMaxScalerWrapper" => new MinMaxScalerWrapper() + case "StandardScalerWrapper" => new StandardScalerWrapper() } } - def load(): Array[TransformerWrapper] = { - _ - } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala new file mode 100644 index 000000000..8d9a6fed5 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala @@ -0,0 +1,46 @@ +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.{MinMaxScaler, MinMaxScalerModel} + +private[feature] class MinMaxScalerWrapper extends TransformerWrapper { + + override val transformer = new MinMaxScaler() + override var parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("numerical") + override val requiredOutputCols: Array[String] = Array("minMaxNumerical") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[MinMaxScalerModel].setInputCol(getInputCols(0)) + transformer.asInstanceOf[MinMaxScalerModel].setOutputCol(getOutputCols(0)) + this + } + +// def fit(dataFrame: DataFrame): Unit = { +// transformer = estimator.fit(dataFrame) +// } + +// def transform(dataset: Dataset[_]): DataFrame = { +// +// val inputCol = "features" +// val OutputCol = "scaledFeatures" +// +// val df = dataset.toDF() +// +// val scaler = new MinMaxScaler().setInputCol("features").setOutputCol("scaledFeatures") +// +// val scalerModel = scaler.fit(df) +// +// val scaledDf = scalerModel.transform(df) +// +// scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") +// } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala new file mode 100644 index 000000000..f43f6d46f --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala @@ -0,0 +1,45 @@ +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.{StandardScaler, StandardScalerModel} + +class StandardScalerWrapper extends TransformerWrapper { + + override val transformer = new StandardScaler() + override var parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("numerical") + override val requiredOutputCols: Array[String] = Array("standardNumerical") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[StandardScalerModel].setInputCol(getInputCols(0)) + transformer.asInstanceOf[StandardScalerModel].setOutputCol(getOutputCols(0)) + this + } + +// def fit(df: DataFrame): Transformer = { +// estimator.fit(df) +// } +// +// def transform(dataset: Dataset[_]): DataFrame = { +// val df = dataset.toDF() +// +// val scaler = new StandardScaler() +// .setInputCol("features") +// .setOutputCol("scaledFeatures") +// .setWithStd(true) +// .setWithMean(true) +// val scalerModel = scaler.fit(df) +// +// val scaledDf = scalerModel.transform(df) +// +// scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") +// } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala index 6146bdb35..d4330aa87 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StopWordsRemoverWrapper.scala @@ -31,7 +31,6 @@ class StopWordsRemoverWrapper extends TransformerWrapper { override val hasMultiInputs: Boolean = false override val hasMultiOutputs: Boolean = false override val needAncestorInputs: Boolean = false - override val needFit: Boolean = false override val relation: InToOutRelation = OneToOne diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala deleted file mode 100644 index dd4a2280d..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineDriver.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature - -import org.apache.spark.sql.SparkSession - -object PipelineDriver { - - def main(args: Array[String]): Unit = { - - val spark = SparkSession.builder().master("local").getOrCreate() - - val inputPath = "data/" - - val inputDF = DataLoader.load(spark, "libsvm", "input/data") - - - } - -} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala deleted file mode 100644 index 84d226d3f..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/PipelineWrapper.scala +++ /dev/null @@ -1,27 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature - -import org.apache.spark.ml.Pipeline - -class PipelineWrapper { - - var components: Array[TransformerWrapper] = ??? - - val pipeline = new Pipeline() - - def setComponents(components: Array[TransformerWrapper]): Unit = { - this.components = components - } - - def fit() = _ - - def transform() = _ - -} - -class LinearPipeline { - -} - -class DAGPipeline { - -} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala deleted file mode 100644 index de103512a..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/MinMaxScalerWrapper.scala +++ /dev/null @@ -1,50 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature.preprocess - -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} -import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper -import org.apache.spark.ml.{Estimator, Transformer} -import org.apache.spark.ml.feature.{MinMaxScaler, MinMaxScalerModel} -import org.apache.spark.ml.linalg.Vectors -import org.apache.spark.sql.{DataFrame, Dataset, SparkSession} - -private[preprocess] class MinMaxScalerWrapper extends TransformerWrapper { - - override var transformer: Transformer = _ - val estimator = new MinMaxScaler() - override val parent: TransformerWrapper = _ - - override val hasMultiInputs: Boolean = false - override val hasMultiOutputs: Boolean = false - override val needAncestorInputs: Boolean = false - - override val relation: InToOutRelation = OneToOne - - override val requiredInputCols: Array[String] = Array("numerical") - override val requiredOutputCols: Array[String] = Array("minMaxNumerical") - - override def declareInAndOut(): this.type = { - transformer.asInstanceOf[MinMaxScalerModel].setInputCol(getInputCols(0)) - transformer.asInstanceOf[MinMaxScalerModel].setOutputCol(getOutputCols(0)) - this - } - - def fit(dataFrame: DataFrame): Unit = { - transformer = estimator.fit(dataFrame) - } - - def transform(dataset: Dataset[_]): DataFrame = { - - val inputCol = "features" - val OutputCol = "scaledFeatures" - - val df = dataset.toDF() - - val scaler = new MinMaxScaler().setInputCol("features").setOutputCol("scaledFeatures") - - val scalerModel = scaler.fit(df) - - val scaledDf = scalerModel.transform(df) - - scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") - } -} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala deleted file mode 100644 index 1c333e362..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/automl/feature/preprocess/StandardScalerWrapper.scala +++ /dev/null @@ -1,48 +0,0 @@ -package com.tencent.angel.spark.ml.automl.feature.preprocess - -import com.tencent.angel.spark.ml.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} -import com.tencent.angel.spark.ml.automl.feature.TransformerWrapper -import org.apache.spark.ml.Transformer -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.ml.feature.{StandardScaler, StandardScalerModel} - -class StandardScalerWrapper extends TransformerWrapper { - - override val transformer: Transformer = _ - override val parent: TransformerWrapper = _ - val estimator = new StandardScaler() - - override val hasMultiInputs: Boolean = false - override val hasMultiOutputs: Boolean = false - override val needAncestorInputs: Boolean = false - - override val relation: InToOutRelation = OneToOne - - override val requiredInputCols: Array[String] = Array("numerical") - override val requiredOutputCols: Array[String] = Array("standardNumerical") - - override def declareInAndOut(): this.type = { - transformer.asInstanceOf[StandardScalerModel].setInputCol(getInputCols(0)) - transformer.asInstanceOf[StandardScalerModel].setOutputCol(getOutputCols(0)) - this - } - - def fit(df: DataFrame): Transformer = { - estimator.fit(df) - } - - def transform(dataset: Dataset[_]): DataFrame = { - val df = dataset.toDF() - - val scaler = new StandardScaler() - .setInputCol("features") - .setOutputCol("scaledFeatures") - .setWithStd(true) - .setWithMean(true) - val scalerModel = scaler.fit(df) - - val scaledDf = scalerModel.transform(df) - - scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") - } -} From e5ddfe36060d90647a6b0ae40f61153245c8f032 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 10 Jan 2019 14:06:05 +0800 Subject: [PATCH 061/115] bug fix --- .../com/tencent/angel/spark/automl/tuner/solver/Solver.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 588bae3d4..1b238b018 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -119,7 +119,7 @@ object Solver { new Solver(cs, sur, acq, opt) } - def apply(array: Array[ParamSpace[AnyVal]], minimize: Boolean): Solver = { + def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean): Solver = { val cs: ConfigurationSpace = new ConfigurationSpace("cs") array.foreach(cs.addParam) val sur: Surrogate = new GPSurrogate(cs, minimize) From a2967f597c5a14344614c3d9d4efd6af6d1c89c4 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 16 Jan 2019 11:03:56 +0800 Subject: [PATCH 062/115] Add random-search and grid-search --- .../spark/automl/tuner/GridTunerExample.scala | 51 +++++++++++ .../automl/tuner/RandomTunerExample.scala | 50 +++++++++++ .../tuner/config/ConfigurationSpace.scala | 90 +++++++++++++++++++ .../spark/automl/tuner/math/BreezeOp.scala | 8 ++ .../tuner/parameter/ContinuousSpace.scala | 6 +- .../tuner/parameter/DiscreteSpace.scala | 14 ++- .../automl/tuner/parameter/ParamSpace.scala | 2 + .../tuner/surrogate/NormalSurrogate.scala | 77 ++++++++++++++++ 8 files changed, 293 insertions(+), 5 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala new file mode 100644 index 000000000..44c355e07 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -0,0 +1,51 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.tuner + +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.surrogate.NormalSurrogate +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} + +object GridTunerExample extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + + val configs: Array[Configuration] = cs.grid_sample() + println(configs.length) +// println(configs(0).getVector) + val sur: NormalSurrogate = new NormalSurrogate(cs, true) + val trail: Trail = new TestTrail() + val results: Array[Double] = trail.evaluate(configs) + sur.update(configs.map(_.getVector), results.map(-_)) + val result = sur.curBest + println() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala new file mode 100644 index 000000000..3aa751e68 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -0,0 +1,50 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.tuner + +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.surrogate.{NormalSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} + +object RandomTunerExample extends App { + + override def main(args: Array[String]): Unit = { + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + cs.addParam(param1) + cs.addParam(param2) + cs.addParam(param3) + cs.addParam(param4) + val sur: NormalSurrogate = new NormalSurrogate(cs, true) + val trail: Trail = new TestTrail() + (0 until 100).foreach{ iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = cs.sample(TunerParam.sampleSize) + val results: Array[Double] = trail.evaluate(configs) + sur.update(configs.map(_.getVector), results.map(-_)) + val result = sur.curBest + println() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index a12668417..3d5c20ec1 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -18,6 +18,7 @@ package com.tencent.angel.spark.automl.tuner.config +import com.tencent.angel.spark.automl.tuner.math.BreezeOp._ import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.commons.logging.{Log, LogFactory} @@ -114,4 +115,93 @@ class ConfigurationSpace( def isValid(vec: Vector): Boolean = !preX.contains(vec) + def grid_sample(): Array[Configuration] = { + var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] +// var missing:Int = 1 +// +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// missing = missing*param.getValues.size +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } +// val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] + val params = getParams() + params.foreach{case (param) => + tmp+=param.getValues + } + var params_array:Array[Array[Double]] = tmp.toArray + +// var params_vec: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + + if (numParams==1){ + var params_grid:Array[Array[Double]] = params_array + var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] + params_grid.foreach{case (param) => + tmp+=Vectors.dense(param) + } + var params_vec = tmp.toArray + params_vec.filter(isValid).foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) + } + configs.toArray + } + + else if(numParams==2){ + var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] + params_grid.foreach{case (param) => + tmp+=Vectors.dense(param) + } + var params_vec: Array[Vector] = tmp.toArray + params_vec.filter(isValid).foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) + } + configs.toArray + } + + else{ + var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + + params_array.foreach{case(a)=> + if (a != params_array(0) && a != params_array(1)){ + params_grid = cartesian(params_grid,a) + } + } + + var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] + params_grid.foreach{case (param) => + tmp+=Vectors.dense(param) + } + var params_vec: Array[Vector] = tmp.toArray + params_vec.filter(isValid).foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) + } + configs.toArray + } + +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// param.getValues +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } +// +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// val params = List.fill(missing/param.getValues.size)(param.getValues) +// val params_Array = params.flatMap(_.toList).toArray +// +// params_Array.zipWithIndex.foreach { case (f: Double, i: Int) => +// vectors(i).toArray(paramIdx) = f +// } +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } + + } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala index e930c2418..dabee43b0 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala @@ -76,4 +76,12 @@ object BreezeOp { BDV(grads) } + + def cartesian(A:Array[Double], B:Array[Double]) = for (a <- A; b <- B) yield { + Array(a,b) + } + + def cartesian(A:Array[Array[Double]], B:Array[Double]) = for (a <- A; b <- B) yield { + (a.toBuffer+=b).toArray + } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index ee6914779..1e30c13d3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.tuner.parameter - import com.tencent.angel.spark.automl.utils.{AutoMLException, Distribution} import scala.collection.mutable.ArrayBuffer @@ -89,7 +88,6 @@ class ContinuousSpace( } case _ => println(s"Distribution $distribution not supported") } - ret.toArray } @@ -121,8 +119,10 @@ class ContinuousSpace( object ContinuousSpace { def main(args: Array[String]): Unit = { - val obj = new ContinuousSpace("test", "0,10") +// val obj = new ContinuousSpace("test", "0,10") + val obj = new ContinuousSpace("param1", 0, 10, 11) println(obj.toString) + println(obj.getValues(1)) println(obj.sample(2).mkString(",")) } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 96d2cdcb2..75dc8549b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.tuner.parameter - import com.tencent.angel.spark.automl.utils.AutoMLException import scala.reflect.ClassTag @@ -85,9 +84,19 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( } } + def asDouble(num: AnyVal): Double = { + num match { + case i: Int => i.toDouble + case i: Long => i.toLong + case i: Float => i.toDouble + case i: Double => i + case _ => throw new AutoMLException(s"type ${num.getClass} is not supported") + } + } + val rd = new Random(seed) - def getValues: Array[T] = values + def getValues: Array[Double] = values.map(asDouble) def numValues: Int = values.length @@ -110,6 +119,7 @@ object DiscreteSpace { def main(args: Array[String]): Unit = { val obj = new DiscreteSpace[Int]("test", "1:10:1") println(obj.toString) + println(obj.getValues(1)) println(obj.sample(2).toString()) } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index 03a838ca5..b3e0bfaaf 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -33,4 +33,6 @@ abstract class ParamSpace[+T: ClassTag](val name: String, def sampleOne(): T + def getValues: Array[Double] + } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala new file mode 100644 index 000000000..f0d21a71f --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala @@ -0,0 +1,77 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.tuner.surrogate + +import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.ml.linalg.Vector +import org.apache.spark.sql.types.{DataTypes, StructField, StructType} + +import scala.collection.mutable.ArrayBuffer + + +class NormalSurrogate( + val cs: ConfigurationSpace, + val minimize: Boolean = true) { + + var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() + fields += DataTypes.createStructField("label", DataTypes.DoubleType, false) + fields += DataTypes.createStructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) + + val schema: StructType = StructType( + StructField("label", DataTypes.DoubleType, nullable = false) :: + StructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) :: + Nil) + + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + // Previous input data points, (N, D) + var preX: ArrayBuffer[Vector] = new ArrayBuffer[Vector]() + // previous target value, (N, ) + var preY: ArrayBuffer[Double] = new ArrayBuffer[Double]() + + + def update(X: Array[Vector], Y: Array[Double]): Unit = { + preX ++= X + preY ++= Y + } + + def curBest: (Vector, Double) = { + if (minimize) curMin else curMax + } + + def curMin: (Vector, Double) = { + if (preY.isEmpty) + (null, Double.MaxValue) + else { + val maxIdx: Int = preY.zipWithIndex.max._2 + (preX(maxIdx), -preY(maxIdx)) + } + } + + def curMax: (Vector, Double) = { + if (preY.isEmpty) + (null, Double.MinValue) + else { + val maxIdx: Int = preY.zipWithIndex.max._2 + (preX(maxIdx), preY(maxIdx)) + } + } + +} \ No newline at end of file From a09a43c6f30604b32183be1944cf3f09e29e8306 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 16 Jan 2019 11:11:33 +0800 Subject: [PATCH 063/115] Add BreezeOpTest --- .../angel/spark/automl/BreezeOpTest.scala | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/BreezeOpTest.scala diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/BreezeOpTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/BreezeOpTest.scala new file mode 100644 index 000000000..75920795e --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/BreezeOpTest.scala @@ -0,0 +1,89 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl + +import com.tencent.angel.spark.automl.tuner.math.BreezeOp._ +import org.junit.Assert._ +import org.junit._ + +class BreezeOpTest { + + @Test def test_cartesian = { + + val a: Array[Double] = Array(1.0, 2.0) + val b: Array[Double] = Array(3.0, 4.0) + val c: Array[Array[Double]] = cartesian(a, b) +// println(c.deep.mkString("\n")) + val expected:Array[Array[Double]] = Array(Array(1.0, 3.0), Array(1.0, 4.0), Array(2.0, 3.0), Array(2.0, 4.0)) +// println(expected.deep.mkString("\n")) + assertEquals(expected.deep.mkString("\n"), c.deep.mkString("\n")) + } + + @Test def test_cartesian_ = { + + val a: Array[Double] = Array(1.0, 2.0) + val b: Array[Double] = Array(3.0, 4.0) + val c: Array[Double] = Array(5.0, 6.0) + val d: Array[Array[Double]] = cartesian(a, b) + val e: Array[Array[Double]] = cartesian(d,c) + val expected = Array(Array(1.0, 3.0, 5.0), + Array(1.0, 3.0, 6.0), + Array(1.0, 4.0, 5.0), + Array(1.0, 4.0, 6.0), + Array(2.0, 3.0, 5.0), + Array(2.0, 3.0, 6.0), + Array(2.0, 4.0, 5.0), + Array(2.0, 4.0, 6.0)) + println(e.deep.mkString("\n")) + assertEquals(expected.deep.mkString("\n"), e.deep.mkString("\n")) + } + + @Test def test_cartesian_Array = { + + val a: Array[Double] = Array(1.0, 2.0) + val b: Array[Double] = Array(3.0, 4.0) + val c: Array[Double] = Array(5.0, 6.0) + val d: Array[Double] = Array(7.0, 8.0) + val params_array = Array(a,b,c,d) + var tmp:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + params_array.foreach{case(a)=> + if (a != params_array(0) && a != params_array(1)){ + tmp = cartesian(tmp,a) + } + } + val expected = Array(Array(1.0, 3.0, 5.0, 7.0), + Array(1.0, 3.0, 5.0, 8.0), + Array(1.0, 3.0, 6.0, 7.0), + Array(1.0, 3.0, 6.0, 8.0), + Array(1.0, 4.0, 5.0, 7.0), + Array(1.0, 4.0, 5.0, 8.0), + Array(1.0, 4.0, 6.0, 7.0), + Array(1.0, 4.0, 6.0, 8.0), + Array(2.0, 3.0, 5.0, 7.0), + Array(2.0, 3.0, 5.0, 8.0), + Array(2.0, 3.0, 6.0, 7.0), + Array(2.0, 3.0, 6.0, 8.0), + Array(2.0, 4.0, 5.0, 7.0), + Array(2.0, 4.0, 5.0, 8.0), + Array(2.0, 4.0, 6.0, 7.0), + Array(2.0, 4.0, 6.0, 8.0)) + println(tmp.deep.mkString("\n")) + assertEquals(expected.deep.mkString("\n"), tmp.deep.mkString("\n")) + } +} From 9c71a4370c93341d0d77eee1f71385ef5306f5a7 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 16 Jan 2019 16:30:27 +0800 Subject: [PATCH 064/115] bug fix of preprocess --- .../angel/spark/automl/feature/PipelineBuilder.scala | 9 ++++++++- .../angel/spark/automl/feature/TransformerWrapper.scala | 3 ++- .../automl/feature/preprocess/MinMaxScalerWrapper.scala | 4 ++-- .../feature/preprocess/StandardScalerWrapper.scala | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala index ad904033f..c3a7f6707 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala @@ -33,7 +33,14 @@ object PipelineBuilder { //val allInputCols: ArrayBuffer[String] = new ArrayBuffer[String]() val allInputCols: mutable.HashSet[String] = new mutable.HashSet[String]() - (1 to transformers.length).foreach { i => + transformers(0).setInputCols(transformers(0).requiredInputCols) + transformers(0).setOutputCols(transformers(0).requiredOutputCols) + allInputCols ++= transformers(0).getInputCols + transformers(0).setAncestorCols(allInputCols.toArray) + stages += transformers(0).declareInAndOut().getTransformer + + (1 until transformers.length).foreach { i => + println(s"transformer $i") // set parent transformers(i).setParent(transformers(i - 1)) // add new cols diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala index eefe5fd88..c9ef2ead7 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala @@ -56,7 +56,8 @@ abstract class TransformerWrapper { def setAncestorCols(cols: Array[String]): Unit = ancestorCols = cols def generateInputCols(): Unit = { - require(ancestorCols.contains(requiredInputCols), "Missing required input cols.") + //require(ancestorCols.contains(requiredInputCols), "Missing required input cols.") + require(requiredInputCols.forall(ancestorCols.contains), "Missing required input cols.") // if transformer has required input cols, feed required input cols // if transformer needs all input cols, feed all input cols // if transformer has no required input cols, feed the output cols of the parent transformer diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala index 8d9a6fed5..35dc80194 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala @@ -19,8 +19,8 @@ private[feature] class MinMaxScalerWrapper extends TransformerWrapper { override val requiredOutputCols: Array[String] = Array("minMaxNumerical") override def declareInAndOut(): this.type = { - transformer.asInstanceOf[MinMaxScalerModel].setInputCol(getInputCols(0)) - transformer.asInstanceOf[MinMaxScalerModel].setOutputCol(getOutputCols(0)) + transformer.asInstanceOf[MinMaxScaler].setInputCol(getInputCols(0)) + transformer.asInstanceOf[MinMaxScaler].setOutputCol(getOutputCols(0)) this } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala index f43f6d46f..4cc9e6d7e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala @@ -19,8 +19,8 @@ class StandardScalerWrapper extends TransformerWrapper { override val requiredOutputCols: Array[String] = Array("standardNumerical") override def declareInAndOut(): this.type = { - transformer.asInstanceOf[StandardScalerModel].setInputCol(getInputCols(0)) - transformer.asInstanceOf[StandardScalerModel].setOutputCol(getOutputCols(0)) + transformer.asInstanceOf[StandardScaler].setInputCol(getInputCols(0)) + transformer.asInstanceOf[StandardScaler].setOutputCol(getOutputCols(0)) this } From 10ed2cfbe01116f0164c6a98e3039ae1abfad20c Mon Sep 17 00:00:00 2001 From: wentao_zhang <1299799152@qq.com> Date: Wed, 16 Jan 2019 17:51:32 +0800 Subject: [PATCH 065/115] Fix the wrong definition of EI --- .../com/tencent/angel/spark/automl/tuner/acquisition/EI.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala index e6ecef75d..ab9a5ad6a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala @@ -53,7 +53,7 @@ class EI( // using a RF, std should be never exactly 0.0 (0.0, Vectors.dense(new Array[Double](X.size))) } else { - val z = (eta - pred._1 - par) / s + val z = (pred._1 - eta - par) / s val norm: NormalDistribution = new NormalDistribution val cdf: Double = norm.cumulativeProbability(z) val pdf: Double = norm.density(z) From 7a24a26293421636663932aa7de6ad259b4d301b Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 17 Jan 2019 15:34:35 +0800 Subject: [PATCH 066/115] code format --- .../spark/automl/tuner/GridTunerExample.scala | 6 +- .../tuner/config/ConfigurationSpace.scala | 82 +++++-------------- .../spark/automl/tuner/math/BreezeOp.scala | 9 +- .../tuner/surrogate/NormalSurrogate.scala | 1 - 4 files changed, 27 insertions(+), 71 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index 44c355e07..d7353ba51 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -36,9 +36,8 @@ object GridTunerExample extends App { cs.addParam(param3) cs.addParam(param4) - val configs: Array[Configuration] = cs.grid_sample() - println(configs.length) -// println(configs(0).getVector) + val configs: Array[Configuration] = cs.gridSample() + println(s"Sie of grid search: ${configs.length}") val sur: NormalSurrogate = new NormalSurrogate(cs, true) val trail: Trail = new TestTrail() val results: Array[Double] = trail.evaluate(configs) @@ -46,6 +45,5 @@ object GridTunerExample extends App { val result = sur.curBest println() println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 3d5c20ec1..d47060d08 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -115,93 +115,55 @@ class ConfigurationSpace( def isValid(vec: Vector): Boolean = !preX.contains(vec) - def grid_sample(): Array[Configuration] = { + def gridSample(): Array[Configuration] = { var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] -// var missing:Int = 1 -// -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// missing = missing*param.getValues.size -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } -// val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] + val params = getParams() - params.foreach{case (param) => - tmp+=param.getValues - } - var params_array:Array[Array[Double]] = tmp.toArray + params.foreach { tmp += _.getValues } -// var params_vec: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + val paramsArray: Array[Array[Double]] = tmp.toArray - if (numParams==1){ - var params_grid:Array[Array[Double]] = params_array + if (numParams == 1){ + val paramsGrid : Array[Array[Double]] = paramsArray var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach { tmp += Vectors.dense(_) } + val paramsVec = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } - else if(numParams==2){ - var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + else if (numParams == 2){ + val paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec: Array[Vector] = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach { tmp += Vectors.dense(_) } + val paramsVec: Array[Vector] = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } else{ - var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + var paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) - params_array.foreach{case(a)=> - if (a != params_array(0) && a != params_array(1)){ - params_grid = cartesian(params_grid,a) + paramsArray.foreach { a => + if (!(a sameElements paramsArray(0)) && !(a sameElements paramsArray(1))) { + paramsGrid = cartesian(paramsGrid, a) } } var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec: Array[Vector] = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach{ tmp += Vectors.dense(_) } + val paramsVec: Array[Vector] = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// param.getValues -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } -// -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// val params = List.fill(missing/param.getValues.size)(param.getValues) -// val params_Array = params.flatMap(_.toList).toArray -// -// params_Array.zipWithIndex.foreach { case (f: Double, i: Int) => -// vectors(i).toArray(paramIdx) = f -// } -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } - } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala index dabee43b0..46e5aa002 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala @@ -77,11 +77,8 @@ object BreezeOp { BDV(grads) } - def cartesian(A:Array[Double], B:Array[Double]) = for (a <- A; b <- B) yield { - Array(a,b) - } + def cartesian(A: Array[Double], B: Array[Double]): Array[Array[Double]] = for (a <- A; b <- B) yield { Array(a,b) } + + def cartesian(A: Array[Array[Double]], B: Array[Double]): Array[Array[Double]] = for (a <- A; b <- B) yield { (a.toBuffer += b).toArray } - def cartesian(A:Array[Array[Double]], B:Array[Double]) = for (a <- A; b <- B) yield { - (a.toBuffer+=b).toArray - } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala index f0d21a71f..b26091a93 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala @@ -46,7 +46,6 @@ class NormalSurrogate( // previous target value, (N, ) var preY: ArrayBuffer[Double] = new ArrayBuffer[Double]() - def update(X: Array[Vector], Y: Array[Double]): Unit = { preX ++= X preY ++= Y From 7b1453636524c76e8995e53088d680e221571000 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 23 Jan 2019 13:23:18 +0800 Subject: [PATCH 067/115] Refactor the code of Random-search and Grid-search so that they can write in the same style of GP. --- .../spark/automl/tuner/GPTunerExample.scala | 12 ++-- .../spark/automl/tuner/GridTunerExample.scala | 28 +++++----- .../automl/tuner/RandomTunerExample.scala | 25 +++++---- .../angel/spark/automl/tuner/TunerParam.scala | 2 +- .../tuner/parameter/ContinuousSpace.scala | 22 +++++++- .../tuner/parameter/DiscreteSpace.scala | 17 ++++-- .../spark/automl/tuner/solver/Solver.scala | 51 ++++++++++++----- .../automl/tuner/solver/SolverWithTrail.scala | 2 +- .../tuner/surrogate/NormalSurrogate.scala | 55 +++++-------------- 9 files changed, 117 insertions(+), 97 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 53ae79e6f..dd433cf52 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -29,15 +29,15 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") - val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0",seed = 30) + val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1",seed = 40) val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() - (0 until 100).foreach{ iter => + (0 until 25).foreach{ iter => println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest + val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index 44c355e07..1e9434251 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -20,32 +20,30 @@ package com.tencent.angel.spark.automl.tuner import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.tuner.surrogate.NormalSurrogate import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector object GridTunerExample extends App { override def main(args: Array[String]): Unit = { val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) +// val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) +// val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) +// val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val cs: ConfigurationSpace = new ConfigurationSpace("cs") cs.addParam(param1) - cs.addParam(param2) - cs.addParam(param3) - cs.addParam(param4) - - val configs: Array[Configuration] = cs.grid_sample() - println(configs.length) -// println(configs(0).getVector) - val sur: NormalSurrogate = new NormalSurrogate(cs, true) +// cs.addParam(param2) +// cs.addParam(param3) +// cs.addParam(param4) + val solver: Solver = Solver(cs, train = false) val trail: Trail = new TestTrail() + val configs: Array[Configuration] = solver.suggest(grid = true) val results: Array[Double] = trail.evaluate(configs) - sur.update(configs.map(_.getVector), results.map(-_)) - val result = sur.curBest - println() + solver.feed(configs, results) + val result: (Vector, Double) = solver.optimal + solver.stop println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index 3aa751e68..3a6d56426 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -20,31 +20,32 @@ package com.tencent.angel.spark.automl.tuner import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.surrogate.{NormalSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector object RandomTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0",seed = 30) + val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1",seed = 40) val cs: ConfigurationSpace = new ConfigurationSpace("cs") cs.addParam(param1) cs.addParam(param2) cs.addParam(param3) cs.addParam(param4) - val sur: NormalSurrogate = new NormalSurrogate(cs, true) + val solver: Solver = Solver(cs, train = false) val trail: Trail = new TestTrail() - (0 until 100).foreach{ iter => + (0 until 25).foreach{ iter => println(s"------iteration $iter starts------") - val configs: Array[Configuration] = cs.sample(TunerParam.sampleSize) + val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) - sur.update(configs.map(_.getVector), results.map(-_)) - val result = sur.curBest - println() - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + solver.feed(configs, results) } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala index a3bb5e05f..5face691c 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala @@ -24,7 +24,7 @@ class TunerParam { object TunerParam { var batchSize: Int = 1 - var sampleSize: Int = 10 * batchSize + var sampleSize: Int = 1000* batchSize var taskName: String = "com.tencent.angel.spark.automl.tuner.trail.TestRunner" diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 1e30c13d3..c45d2e8ae 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -38,16 +38,32 @@ class ContinuousSpace( var num: Int, distribution: Distribution.Value = Distribution.LINEAR, override val doc: String = "continuous param space", - seed: Int = 100) extends ParamSpace[Double](name, doc) { + var seed: Int =100) extends ParamSpace[Double](name, doc) { private val helper: String = "supported format of continuous parameter: [0,1] or [0,1,100]" def this(name: String, lower: Double, upper: Double) = { - this(name, lower, upper, -1) + this(name, lower, upper, -1, seed = 100) + } + + def this(name: String, lower: Double, upper: Double, seed:Int) = { + this(name, lower, upper, -1,seed = seed) } def this(name: String, config: String) = { - this(name, 0, 1, -1) + this(name, 0, 1, -1, seed = 100) + val items = parseConfig(config) + lower = items._1 + upper = items._2 + num = items._3 + if (num != -1) { + isGrid = true + gridValues = toGrid + } + } + + def this(name: String, config: String, seed: Int) = { + this(name, 0, 1, -1, seed = seed) val items = parseConfig(config) lower = items._1 upper = items._2 diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 75dc8549b..88780089b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -33,17 +33,26 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( override val name: String, var values: Array[T], override val doc: String = "discrete param", - seed: Int = 100) extends ParamSpace[T](name, doc) { + var seed: Int = 100) extends ParamSpace[T](name, doc) { private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" def this(name: String, config: String, doc: String) = { - this(name, Array.empty[T], doc) + this(name, Array.empty[T], doc, seed = 100) + this.values = parseConfig(config) + } + + def this(name: String, config: String, doc: String, seed: Int) = { + this(name, Array.empty[T], doc, seed = seed) this.values = parseConfig(config) } def this(name: String, config: String) = { - this(name, config, "discrete param") + this(name, config, "discrete param", seed = 100) + } + + def this(name: String, config: String, seed: Int) = { + this(name, config, "discrete param", seed = seed) } def parseConfig(config: String): Array[T] = { @@ -117,7 +126,7 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( object DiscreteSpace { def main(args: Array[String]): Unit = { - val obj = new DiscreteSpace[Int]("test", "1:10:1") + val obj = new DiscreteSpace[Int]("test", "1:10:1",seed = 10) println(obj.toString) println(obj.getValues(1)) println(obj.sample(2).toString()) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 1b238b018..9dc8435bb 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -24,7 +24,7 @@ import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.surrogate.{GPSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.surrogate.{GPSurrogate, NormalSurrogate, Surrogate} import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} @@ -33,7 +33,8 @@ class Solver( val cs: ConfigurationSpace, val surrogate: Surrogate, val acqFuc: Acquisition, - val optimizer: AcqOptimizer) { + val optimizer: AcqOptimizer, + val train: Boolean = true) { val LOG: Log = LogFactory.getLog(classOf[Solver]) @@ -47,19 +48,19 @@ class Solver( cs.addParam(param) } - def addParam(pType: String, vType: String, name: String, config: String): Unit = { + def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): Unit = { pType.toLowerCase match { case "discrete" => vType.toLowerCase match { - case "float" => addParam(new DiscreteSpace[Float](name, config)) - case "double" => addParam(new DiscreteSpace[Double](name, config)) - case "int" => addParam(new DiscreteSpace[Int](name, config)) - case "long" => addParam(new DiscreteSpace[Long](name, config)) + case "float" => addParam(new DiscreteSpace[Float](name, config, seed = seed)) + case "double" => addParam(new DiscreteSpace[Double](name, config, seed = seed)) + case "int" => addParam(new DiscreteSpace[Int](name, config, seed = seed)) + case "long" => addParam(new DiscreteSpace[Long](name, config, seed = seed)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case "continuous" => vType.toLowerCase match { - case "double" => addParam(new ContinuousSpace(name, config)) + case "double" => addParam(new ContinuousSpace(name, config, seed = seed)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case _ => throw new AutoMLException(s"unsupported param type $pType, should be ${PARAM_TYPES.mkString(",")}") @@ -69,14 +70,26 @@ class Solver( /** * Suggests configurations to evaluate. */ - def suggest(): Array[Configuration] = { - val acqAndConfig = optimizer.maximize(TunerParam.batchSize) - println(s"suggest configurations:") - acqAndConfig.foreach{ case (acq, config) => - println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + - s"acquisition[$acq]") + def suggest(grid:Boolean = false): Array[Configuration] = { + if (train){ + val acqAndConfig = optimizer.maximize(TunerParam.batchSize) + println(s"suggest configurations:") + acqAndConfig.foreach{ case (acq, config) => + println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + + s"acquisition[$acq]") + } + acqAndConfig.map(_._2) + } + else { + if(grid){ + val configs: Array[Configuration] = cs.grid_sample() + configs + } + else { + val configs: Array[Configuration] = cs.sample(TunerParam.sampleSize) + configs + } } - acqAndConfig.map(_._2) } /** @@ -119,6 +132,14 @@ object Solver { new Solver(cs, sur, acq, opt) } + def apply(cs: ConfigurationSpace, train: Boolean = false, minimize: Boolean = true): Solver = { + val sur: Surrogate = new NormalSurrogate(cs, minimize) + //although acq and opt have been defined, they'll be not be used in random-search and grid-search + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt, train) + } + def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean): Solver = { val cs: ConfigurationSpace = new ConfigurationSpace("cs") array.foreach(cs.addParam) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala index 310e6b362..f04960677 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala @@ -37,7 +37,7 @@ class SolverWithTrail(val solver: Solver, val trail: Trail) { solver.feed(X, Y) (0 until numIter).foreach{ iter => println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest + val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala index f0d21a71f..de08c0971 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala @@ -19,59 +19,34 @@ package com.tencent.angel.spark.automl.tuner.surrogate import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace -import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.ml.linalg.Vector -import org.apache.spark.sql.types.{DataTypes, StructField, StructType} - -import scala.collection.mutable.ArrayBuffer class NormalSurrogate( - val cs: ConfigurationSpace, - val minimize: Boolean = true) { - - var fields: ArrayBuffer[StructField] = new ArrayBuffer[StructField]() - fields += DataTypes.createStructField("label", DataTypes.DoubleType, false) - fields += DataTypes.createStructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) - - val schema: StructType = StructType( - StructField("label", DataTypes.DoubleType, nullable = false) :: - StructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) :: - Nil) - - val LOG: Log = LogFactory.getLog(classOf[Surrogate]) - - // Previous input data points, (N, D) - var preX: ArrayBuffer[Vector] = new ArrayBuffer[Vector]() - // previous target value, (N, ) - var preY: ArrayBuffer[Double] = new ArrayBuffer[Double]() + override val cs: ConfigurationSpace, + override val minimize: Boolean = true)extends Surrogate(cs, minimize) { - - def update(X: Array[Vector], Y: Array[Double]): Unit = { + override def update(X: Array[Vector], Y: Array[Double]): Unit = { preX ++= X preY ++= Y } - def curBest: (Vector, Double) = { - if (minimize) curMin else curMax + /** + * NormalSurrogate is designed for random-search and grid-search + * + * Thus it doesn't need train and predict function + */ + override def train(): Unit = { + } - def curMin: (Vector, Double) = { - if (preY.isEmpty) - (null, Double.MaxValue) - else { - val maxIdx: Int = preY.zipWithIndex.max._2 - (preX(maxIdx), -preY(maxIdx)) - } + + def predict(X: Vector): (Double, Double)={ + (0.0,0.0) } - def curMax: (Vector, Double) = { - if (preY.isEmpty) - (null, Double.MinValue) - else { - val maxIdx: Int = preY.zipWithIndex.max._2 - (preX(maxIdx), preY(maxIdx)) - } + override def stop(): Unit = { + } } \ No newline at end of file From c8951aa4cacc64805413f328b3e8a59d758289e7 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 23 Jan 2019 13:24:27 +0800 Subject: [PATCH 068/115] Fix the bug of Grid-search --- .../spark/automl/tuner/config/ConfigurationSpace.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 3d5c20ec1..e9b661eef 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -133,11 +133,14 @@ class ConfigurationSpace( tmp+=param.getValues } var params_array:Array[Array[Double]] = tmp.toArray +// println(params_array.deep.mkString("\n")) // var params_vec: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) if (numParams==1){ - var params_grid:Array[Array[Double]] = params_array + var params_grid:Array[Double] = params_array(0) +// println(params_grid.deep.mkString("\n")) + var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] params_grid.foreach{case (param) => tmp+=Vectors.dense(param) @@ -146,6 +149,7 @@ class ConfigurationSpace( params_vec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } +// println(configs.toArray.deep.mkString("\n")) configs.toArray } From 270f70ae65e4c7c2bd530d11b6729721bd3ad432 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 23 Jan 2019 13:25:51 +0800 Subject: [PATCH 069/115] Add some test cases --- .../spark/ml/core/AutoOfflineLearner.scala | 4 +- .../ml/core/AutoOfflineLearner_no_train.scala | 241 ++++++++++++++++++ .../tencent/angel/spark/ml/AutoLRTest.scala | 5 +- .../angel/spark/ml/AutoLRTest_Grid.scala | 50 ++++ .../angel/spark/ml/AutoLRTest_Random.scala | 50 ++++ 5 files changed, 346 insertions(+), 4 deletions(-) create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 46bbf4b7c..3affe72ff 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -59,9 +59,9 @@ class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { this } - def addParam(pType: String, vType: String, name: String, config: String): this.type = { + def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): this.type = { paramType += name -> (pType.toLowerCase, vType.toLowerCase) - solver.addParam(pType, vType, name, config) + solver.addParam(pType, vType, name, config, seed) this } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala new file mode 100644 index 000000000..8105a9114 --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala @@ -0,0 +1,241 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.ml.core + +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} +import com.tencent.angel.ml.feature.LabeledData +import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.utils.AutoMLException +import com.tencent.angel.spark.context.PSContext +import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} +import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} +import org.apache.spark.SparkContext +import org.apache.spark.ml.linalg.Vector +import org.apache.spark.rdd.RDD + +import scala.collection.mutable + +class AutoOfflineLearner_no_train(var tuneIter: Int = 20, minimize: Boolean = true, grid: Boolean = false) { + + // Shared configuration with Angel-PS + val conf = SharedConf.get() + if(grid){ + tuneIter = 1 + } + // Some params + var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) + var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) + var validationRatio: Double = conf.getDouble(MLConf.ML_VALIDATE_RATIO) + + println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") + + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + val solver: Solver = Solver(cs, train = false, minimize) + + // param name -> param type (continuous or discrete), value type (int, double,...) + val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() + + def addParam(param: ParamSpace[AnyVal]): this.type = { + solver.addParam(param) + this + } + + def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): this.type = { + paramType += name -> (pType.toLowerCase, vType.toLowerCase) + solver.addParam(pType, vType, name, config, seed) + this + } + + def setParam(name: String, vType: String, value: Double): Unit = { + println(s"set param[$name] type[$vType] value[$value]") + vType match { + case "int" => conf.setInt(name, value.toInt) + case "long" => conf.setLong(name, value.toLong) + case "float" => conf.setFloat(name, value.toFloat) + case "double" => conf.setDouble(name, value) + case _ => throw new AutoMLException(s"unsupported value type $vType") + } + } + + def resetParam(paramMap: mutable.Map[String, Double]): this.type = { + paramMap.foreach(println) + numEpoch = paramMap.getOrElse(MLConf.ML_EPOCH_NUM, numEpoch.toDouble).toInt + fraction = paramMap.getOrElse(MLConf.ML_BATCH_SAMPLE_RATIO, fraction) + validationRatio = paramMap.getOrElse(MLConf.ML_VALIDATE_RATIO, validationRatio) + println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") + this + } + + def evaluate(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { + val scores = data.mapPartitions { case iter => + val output = model.forward(1, iter.toArray) + Iterator.single((output, model.graph.placeHolder.getLabel)) + } + (new AUC().cal(scores), new Precision().cal(scores)) + } + + def train(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { + // split data into train and validate + val ratios = Array(1 - validationRatio, validationRatio) + val splits = data.randomSplit(ratios) + val train = splits(0) + val validate = splits(1) + + data.cache() + train.cache() + validate.cache() + + train.count() + validate.count() + data.unpersist() + + val numSplits = (1.0 / fraction).toInt + val manifold = OfflineLearner.buildManifold(train, numSplits) + + train.unpersist() + + var numUpdate = 1 + + var validateAuc = 0.0 + var validatePrecision = 0.0 + + for (epoch <- 0 until numEpoch) { + val batchIterator = OfflineLearner.buildManifoldIterator(manifold, numSplits) + while (batchIterator.hasNext) { + val (sumLoss, batchSize) = batchIterator.next().mapPartitions { case iter => + PSContext.instance() + val batch = iter.next() + model.forward(epoch, batch) + val loss = model.getLoss() + model.backward() + Iterator.single((loss, batch.length)) + }.reduce((f1, f2) => (f1._1 + f2._1, f1._2 + f2._2)) + + val (lr, boundary) = model.update(numUpdate, batchSize) + val loss = sumLoss / model.graph.taskNum + println(s"epoch=[$epoch] lr[$lr] batchSize[$batchSize] trainLoss=$loss") + if (boundary) { + var validateMetricLog = "" + if (validationRatio > 0.0) { + val metric = evaluate(validate, model) + validateAuc = metric._1 + validatePrecision = metric._2 + validateMetricLog = s"validateAuc=$validateAuc validatePrecision=$validatePrecision" + } + println(s"batch[$numUpdate] $validateMetricLog") + } + numUpdate += 1 + } + } + (validateAuc, validatePrecision) + } + + /** + * Predict the output with a RDD with data and a trained model + * @param data: examples to be predicted + * @param model: a trained model + * @return RDD[(label, predict value)] + * + */ + def predict(data: RDD[(LabeledData, String)], model: GraphModel): RDD[(String, Double)] = { + val scores = data.mapPartitions { iterator => + PSContext.instance() + val samples = iterator.toArray + val output = model.forward(1, samples.map(f => f._1)) + val labels = samples.map(f => f._2) + + (output, model.getLossFunc()) match { + case (mat :BlasDoubleMatrix, _: LogLoss) => + // For LogLoss, the output is (value, sigmoid(value), label) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1))).iterator + case (mat :BlasFloatMatrix, _: LogLoss) => + // For LogLoss, the output is (value, sigmoid(value), label) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1).toDouble)).iterator + case (mat: BlasDoubleMatrix , _: L2Loss) => + // For L2Loss, the output is (value, _, _) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0))).iterator + case (mat: BlasFloatMatrix , _: L2Loss) => + // For L2Loss, the output is (value, _, _) + (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0).toDouble)).iterator + } + } + scores + } + + def train(input: String, + modelOutput: String, + modelInput: String, + dim: Int, + model: GraphModel): Unit = { + val conf = SparkContext.getOrCreate().getConf + val data = SparkContext.getOrCreate().textFile(input) + .repartition(SparkUtils.getNumCores(conf)) + .map(f => DataLoader.parseIntFloat(f, dim)) + + model.init(data.getNumPartitions) + + if (modelInput.length > 0) model.load(modelInput) + + (0 until tuneIter).foreach{ iter => + println(s"==========Tuner Iteration[$iter]==========") + val configs: Array[Configuration] = solver.suggest(grid) + for (config <- configs){ + val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() + for (paramType <- paramType) { + setParam(paramType._1, paramType._2._2, config.get(paramType._1)) + paramMap += (paramType._1 -> config.get(paramType._1)) + } + resetParam(paramMap) + model.resetParam(paramMap).graph.init(0) + val result = train(data, model) + solver.feed(config, result._1) + } + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + + //if (modelOutput.length > 0) model.save(modelOutput) + + } + + def predict(input: String, + output: String, + modelInput: String, + dim: Int, + model: GraphModel): Unit = { + val dataWithLabels = SparkContext.getOrCreate().textFile(input) + .map(f => (DataLoader.parseIntFloat(f, dim), DataLoader.parseLabel(f))) + + model.init(dataWithLabels.getNumPartitions) + model.load(modelInput) + + val predicts = predict(dataWithLabels, model) + if (output.length > 0) + predicts.map(f => s"${f._1} ${f._2}").saveAsTextFile(output) + } + +} + + + diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala index 1ece77014..3988c934c 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala @@ -33,8 +33,9 @@ class AutoLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(5,false) - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100") + learner = new AutoOfflineLearner(25,false) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100",seed = 10) + learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,100",seed = 20) } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala new file mode 100644 index 000000000..5006aac1b --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala @@ -0,0 +1,50 @@ +package com.tencent.angel.spark.ml + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.matrix.RowType +import com.tencent.angel.spark.ml.classification.LogisticRegression +import com.tencent.angel.spark.ml.core.AutoOfflineLearner_no_train + +class AutoLRTest_Grid extends PSFunSuite with SharedPSContext { + private var learner: AutoOfflineLearner_no_train = _ + private var input: String = _ + private var dim: Int = _ + + override def beforeAll(): Unit = { + super.beforeAll() + + input = "../../data/census/census_148d_train.libsvm" + + // build SharedConf with params + SharedConf.get() + SharedConf.get().set(MLConf.ML_MODEL_TYPE, RowType.T_FLOAT_DENSE.toString) + SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) + SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) + SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) + SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) + SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) + SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) + SharedConf.get().setDouble(MLConf.ML_BATCH_SAMPLE_RATIO, 0.2) + dim = SharedConf.indexRange.toInt + + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + learner = new AutoOfflineLearner_no_train(minimize = false, grid = true) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,5",seed = 10) + learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,5",seed = 20) + } + + override def afterAll(): Unit = { + super.afterAll() + } + + test("LogisticRegression") { + val model = new LogisticRegression + learner.train(input, "", "", dim, model) + } + +} diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala new file mode 100644 index 000000000..21b4695f0 --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala @@ -0,0 +1,50 @@ +package com.tencent.angel.spark.ml + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.matrix.RowType +import com.tencent.angel.spark.ml.classification.LogisticRegression +import com.tencent.angel.spark.ml.core.AutoOfflineLearner_no_train + +class AutoLRTest_Random extends PSFunSuite with SharedPSContext { + private var learner: AutoOfflineLearner_no_train = _ + private var input: String = _ + private var dim: Int = _ + + override def beforeAll(): Unit = { + super.beforeAll() + + input = "../../data/census/census_148d_train.libsvm" + + // build SharedConf with params + SharedConf.get() + SharedConf.get().set(MLConf.ML_MODEL_TYPE, RowType.T_FLOAT_DENSE.toString) + SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) + SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) + SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) + SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) + SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) + SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) + SharedConf.get().setDouble(MLConf.ML_BATCH_SAMPLE_RATIO, 0.2) + dim = SharedConf.indexRange.toInt + + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + learner = new AutoOfflineLearner_no_train(25,false, grid = false) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100",seed = 10) + learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,100",seed = 20) + } + + override def afterAll(): Unit = { + super.afterAll() + } + + test("LogisticRegression") { + val model = new LogisticRegression + learner.train(input, "", "", dim, model) + } + +} From 8b0443aea6709bf6b0c87033ff8486084d31ff83 Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Thu, 14 Feb 2019 17:36:37 +0800 Subject: [PATCH 070/115] add some wrappers of text preprocess and a pipelineTest --- .../automl/feature/TransformerWrapper.scala | 6 +- .../preprocess/BuckerizerWrapper.scala | 45 +++++++++++ .../feature/preprocess/HashingTFWrapper.scala | 44 +++++++++++ .../feature/preprocess/IDFWrapper.scala | 26 +++++++ .../preprocess/MinMaxScalerWrapper.scala | 38 +++++---- .../feature/preprocess/PCAWrapper.scala | 45 +++++++++++ .../preprocess/StringIndexerWrapper.scala | 44 +++++++++++ .../feature/preprocess/TokenizerWrapper.scala | 2 +- .../feature/preprocess/Word2VecWrapper.scala | 44 +++++++++++ .../feature/select/ChiSqSelectorWrapper.scala | 43 ++++++++++ .../angel/spark/automl/PipelineTest.scala | 78 +++++++++++++++++++ 11 files changed, 391 insertions(+), 24 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/HashingTFWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/IDFWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/PCAWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Word2VecWrapper.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/ChiSqSelectorWrapper.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/PipelineTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala index c9ef2ead7..330766f9b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala @@ -31,7 +31,7 @@ abstract class TransformerWrapper { val hasMultiInputs: Boolean val hasMultiOutputs: Boolean val needAncestorInputs: Boolean - private val prefix = "out_" + private val prefix = "out" val requiredInputCols: Array[String] val requiredOutputCols: Array[String] @@ -57,7 +57,7 @@ abstract class TransformerWrapper { def generateInputCols(): Unit = { //require(ancestorCols.contains(requiredInputCols), "Missing required input cols.") - require(requiredInputCols.forall(ancestorCols.contains), "Missing required input cols.") +// require(requiredInputCols.forall(ancestorCols.contains), "Missing required input cols.") // if transformer has required input cols, feed required input cols // if transformer needs all input cols, feed all input cols // if transformer has no required input cols, feed the output cols of the parent transformer @@ -77,7 +77,7 @@ abstract class TransformerWrapper { case InToOutRelation.InPlace => setOutputCols(inputCols) case InToOutRelation.OneToOne => - setOutputCols(Array(prefix + inputCols(0))) + setOutputCols(Array(prefix + transformer.getClass.getSimpleName)) case InToOutRelation.MultiToMulti => setOutputCols(inputCols.map(prefix + _)) case InToOutRelation.MultiToOne => diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala new file mode 100644 index 000000000..06c5df777 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala @@ -0,0 +1,45 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper + +import org.apache.spark.ml.feature.Bucketizer + +class BuckerizerWrapper extends TransformerWrapper{ + + override val transformer = new Bucketizer() + override var parent: TransformerWrapper = _ + + override val requiredInputCols: Array[String] = Array("features") + override val requiredOutputCols: Array[String] = Array("outBucketizer") + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override def declareInAndOut(): this.type = { + transformer.setInputCol(getInputCols(0)) + transformer.setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/HashingTFWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/HashingTFWrapper.scala new file mode 100644 index 000000000..aa7f73c57 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/HashingTFWrapper.scala @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.feature.HashingTF + +class HashingTFWrapper(numFeatures: Int) extends TransformerWrapper { + + override val transformer: Transformer = new HashingTF().setNumFeatures(numFeatures) + override var parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("words") + override val requiredOutputCols: Array[String] = Array("outHashingTF") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[HashingTF].setInputCol(getInputCols(0)) + transformer.asInstanceOf[HashingTF].setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/IDFWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/IDFWrapper.scala new file mode 100644 index 000000000..53080929d --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/IDFWrapper.scala @@ -0,0 +1,26 @@ +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.{IDF, StandardScaler} + +class IDFWrapper extends TransformerWrapper { + + override val transformer = new IDF() + override var parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("rawFeatures") + override val requiredOutputCols: Array[String] = Array("outIDF") + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[IDF].setInputCol(getInputCols(0)) + transformer.asInstanceOf[IDF].setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala index 35dc80194..7d40ef7d9 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/MinMaxScalerWrapper.scala @@ -1,3 +1,20 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + package com.tencent.angel.spark.automl.feature.preprocess import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} @@ -16,7 +33,7 @@ private[feature] class MinMaxScalerWrapper extends TransformerWrapper { override val relation: InToOutRelation = OneToOne override val requiredInputCols: Array[String] = Array("numerical") - override val requiredOutputCols: Array[String] = Array("minMaxNumerical") + override val requiredOutputCols: Array[String] = Array("outMinMaxScaler") override def declareInAndOut(): this.type = { transformer.asInstanceOf[MinMaxScaler].setInputCol(getInputCols(0)) @@ -24,23 +41,4 @@ private[feature] class MinMaxScalerWrapper extends TransformerWrapper { this } -// def fit(dataFrame: DataFrame): Unit = { -// transformer = estimator.fit(dataFrame) -// } - -// def transform(dataset: Dataset[_]): DataFrame = { -// -// val inputCol = "features" -// val OutputCol = "scaledFeatures" -// -// val df = dataset.toDF() -// -// val scaler = new MinMaxScaler().setInputCol("features").setOutputCol("scaledFeatures") -// -// val scalerModel = scaler.fit(df) -// -// val scaledDf = scalerModel.transform(df) -// -// scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") -// } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/PCAWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/PCAWrapper.scala new file mode 100644 index 000000000..98e73a61d --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/PCAWrapper.scala @@ -0,0 +1,45 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.PCA + +class PCAWrapper extends TransformerWrapper { + + override val transformer = new PCA() + override var parent: TransformerWrapper = _ + + override val requiredInputCols: Array[String] = Array("features") + override val requiredOutputCols: Array[String] = Array("outPCA") + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override def declareInAndOut(): this.type = { + transformer.setInputCol(getInputCols(0)) + transformer.setOutputCol(getOutputCols(0)) + this + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala new file mode 100644 index 000000000..e0971d55a --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.{StringIndexer, Tokenizer} + +class StringIndexerWrapper extends TransformerWrapper{ + + override val transformer = new StringIndexer() + override var parent: TransformerWrapper = _ + + override val requiredInputCols: Array[String] = Array("words") + override val requiredOutputCols: Array[String] = Array("outStringIndexer") + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override def declareInAndOut(): this.type = { + transformer.asInstanceOf[Tokenizer].setInputCol(getInputCols(0)) + transformer.asInstanceOf[Tokenizer].setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala index 26c2c1464..449511f04 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala @@ -31,7 +31,7 @@ class TokenizerWrapper extends TransformerWrapper { override var parent: TransformerWrapper = _ override val requiredInputCols: Array[String] = Array("sentence") - override val requiredOutputCols: Array[String] = Array("words") + override val requiredOutputCols: Array[String] = Array("outTokenizer") override val hasMultiInputs: Boolean = false override val hasMultiOutputs: Boolean = false diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Word2VecWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Word2VecWrapper.scala new file mode 100644 index 000000000..f4384bf92 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Word2VecWrapper.scala @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.preprocess + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.Word2Vec + +class Word2VecWrapper extends TransformerWrapper { + + override val transformer = new Word2Vec() + override var parent: TransformerWrapper = _ + + override val requiredInputCols: Array[String] = Array("sentences") + override val requiredOutputCols: Array[String] = Array("outWord2Vec") + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override def declareInAndOut(): this.type = { + transformer.setInputCol(getInputCols(0)) + transformer.setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/ChiSqSelectorWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/ChiSqSelectorWrapper.scala new file mode 100644 index 000000000..47f93e1d8 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/ChiSqSelectorWrapper.scala @@ -0,0 +1,43 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.select + +import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, OneToOne} +import com.tencent.angel.spark.automl.feature.TransformerWrapper +import org.apache.spark.ml.feature.{ChiSqSelector, ChiSqSelectorModel} + +class ChiSqSelectorWrapper extends TransformerWrapper { + override val transformer = new ChiSqSelector() + override var parent: TransformerWrapper = _ + + override val hasMultiInputs: Boolean = false + override val hasMultiOutputs: Boolean = false + override val needAncestorInputs: Boolean = false + + override val relation: InToOutRelation = OneToOne + + override val requiredInputCols: Array[String] = Array("numerical") + override val requiredOutputCols: Array[String] = Array("outChiSeSelector") + + override def declareInAndOut(): this.type = { + transformer.setFeaturesCol(getInputCols(0)) + transformer.setOutputCol(getOutputCols(0)) + this + } +} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/PipelineTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/PipelineTest.scala new file mode 100644 index 000000000..39a6e83ee --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/PipelineTest.scala @@ -0,0 +1,78 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import com.tencent.angel.spark.automl.feature.preprocess.{HashingTFWrapper, IDFWrapper, TokenizerWrapper} +import com.tencent.angel.spark.automl.feature.{PipelineBuilder, PipelineWrapper, TransformerWrapper} +import org.apache.spark.sql.SparkSession +import org.junit._ + +class PipelineTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test def testTfIdf(): Unit = { + val sentenceData = spark.createDataFrame(Seq( + (0.0, "Hi I heard about Spark"), + (0.0, "I wish Java could use case classes"), + (1.0, "Logistic regression models are neat") + )).toDF("label", "sentence") + + val pipelineWrapper = new PipelineWrapper() + + val transformers = Array[TransformerWrapper]( + new TokenizerWrapper(), + new HashingTFWrapper(20), + new IDFWrapper() + ) + + val stages = PipelineBuilder.build(transformers) + + transformers.foreach{ transformer => + val inutCols = transformer.getInputCols + val outputCols = transformer.getOutputCols + inutCols.foreach(print) + print(" ") + outputCols.foreach(print) + println() + } + + pipelineWrapper.setStages(stages) + + val model = pipelineWrapper.fit(sentenceData) + + val outputDF = model.transform(sentenceData) + outputDF.select("outIDF").show() + outputDF.select("outIDF").foreach{ row => + println(row.get(0).getClass.getSimpleName) + val arr = row.get(0) + println(arr.toString) + } + outputDF.rdd.map(row => row.toString()).repartition(1) + .saveAsTextFile("output/tfidf") + } + + @Test def testWord2Vec(): Unit = { + + } + + @Test def testNumerical(): Unit = { + + } + +} From 42674db183392ebcd4ad0e490995c312f8f0ec06 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 15 Feb 2019 11:05:31 +0800 Subject: [PATCH 071/115] refine config interface --- .../spark/automl/tuner/GPTunerExample.scala | 12 +++++++---- .../tuner/parameter/ContinuousSpace.scala | 16 +++++++++++++-- .../tuner/parameter/DiscreteSpace.scala | 10 ++++++++-- .../automl/tuner/parameter/ParamSpace.scala | 20 +++++++++++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 53ae79e6f..bb72c6f10 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -29,10 +29,14 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") - val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") +// val param1: ParamSpace[Double] = new ContinuousSpace("param1", "[1,10]") +// val param2: ParamSpace[Double] = new ContinuousSpace("param2", "[-5:5:10]") +// val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "{0.0,1.0,3.0,5.0}") +// val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "{-5:5:1}") val solver: Solver = Solver(Array(param1, param2, param3, param4), true) val trail: Trail = new TestTrail() (0 until 100).foreach{ iter => diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 1e30c13d3..5de0f83d9 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -58,13 +58,21 @@ class ContinuousSpace( } } - def parseConfig(config: String): (Double, Double, Int) = { + def parseConfig(input: String): (Double, Double, Int) = { + assert(input.startsWith("[") && input.endsWith("]")) + val config = input.substring(1, input.length - 1) val ret: (Double, Double, Int) = config.trim match { case _ if config.contains(",") => val splits = config.split(',') splits.length match { case 2 => (splits(0).toDouble, splits(1).toDouble, -1) - case 3 => (splits(0).toDouble, splits(1).toDouble, splits(2).toInt) + case _ => throw new AutoMLException(s"invalid discrete, $helper") + } + case _ if config.contains(":") => + val splits = config.split(':') + splits.length match { + case 3 => (splits (0).toDouble, splits (1).toDouble, splits (2).toInt) + case _ => throw new AutoMLException(s"invalid discrete, $helper") } case _ => throw new AutoMLException(s"invalid discrete, $helper") } @@ -118,6 +126,10 @@ class ContinuousSpace( object ContinuousSpace { + def apply(name: String, config: String) = { + new ContinuousSpace(name, config) + } + def main(args: Array[String]): Unit = { // val obj = new ContinuousSpace("test", "0,10") val obj = new ContinuousSpace("param1", 0, 10, 11) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 75dc8549b..6645754ac 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -46,7 +46,9 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( this(name, config, "discrete param") } - def parseConfig(config: String): Array[T] = { + def parseConfig(input: String): Array[T] = { + assert(input.startsWith("{") && input.endsWith("}")) + val config = input.substring(1, input.length - 1) val values: Array[T] = config.trim match { case _ if config.contains(",") => config.split(',').map(asType) @@ -115,7 +117,11 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( } object DiscreteSpace { - + + def apply[T <: AnyVal: ClassTag](name: String, config: String): DiscreteSpace[T] = { + new DiscreteSpace[T](name, config) + } + def main(args: Array[String]): Unit = { val obj = new DiscreteSpace[Int]("test", "1:10:1") println(obj.toString) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index b3e0bfaaf..f657dccfa 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -18,6 +18,8 @@ package com.tencent.angel.spark.automl.tuner.parameter +import com.tencent.angel.spark.automl.utils.AutoMLException + import scala.reflect.ClassTag @@ -36,3 +38,21 @@ abstract class ParamSpace[+T: ClassTag](val name: String, def getValues: Array[Double] } + +object ParamSpace { + + def fromConfigString(name: String, config: String): ParamSpace[Double] = { + val vType = + if (config.trim.startsWith("[") && config.trim.endsWith("]")) + "continuous" + else if (config.trim.startsWith("{") && config.trim.endsWith("}")) + "discrete" + else "none" + vType match { + case "continuous" => ContinuousSpace(name, config) + case "discrete" => DiscreteSpace[Double](name, config) + case _ => throw new AutoMLException(s"auto param config is not supported") + } + } + +} From e87e902fc78763007843a3ef32418fbceab1496c Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 20 Feb 2019 00:12:55 +0800 Subject: [PATCH 072/115] implement the function to choose the surrogate and rename some classes --- .../spark/automl/tuner/GPTunerExample.scala | 4 +- .../spark/automl/tuner/GridTunerExample.scala | 9 +- .../automl/tuner/RandomTunerExample.scala | 2 +- .../angel/spark/automl/tuner/TunerParam.scala | 2 +- .../tuner/config/ConfigurationSpace.scala | 69 +++-- .../spark/automl/tuner/math/BreezeOp.scala | 9 +- .../spark/automl/tuner/solver/Solver.scala | 60 ++++- .../tuner/surrogate/NormalSurrogate.scala | 6 +- .../spark/automl/tuner/trail/TestRunner.scala | 1 - .../spark/ml/core/AutoOfflineLearner.scala | 34 ++- .../ml/core/AutoOfflineLearner_no_train.scala | 241 ------------------ .../{AutoLRTest.scala => AutoLRTestGP.scala} | 4 +- ...LRTest_Grid.scala => AutoLRTestGrid.scala} | 10 +- ...st_Random.scala => AutoLRTestRandom.scala} | 10 +- 14 files changed, 151 insertions(+), 310 deletions(-) delete mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTest.scala => AutoLRTestGP.scala} (93%) rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTest_Grid.scala => AutoLRTestGrid.scala} (83%) rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTest_Random.scala => AutoLRTestRandom.scala} (83%) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index dd433cf52..321118fd8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -33,11 +33,11 @@ object GPTunerExample extends App { val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0",seed = 30) val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1",seed = 40) - val solver: Solver = Solver(Array(param1, param2, param3, param4), true) + val solver: Solver = Solver(Array(param1, param2, param3, param4), true,surrogate ="GP") val trail: Trail = new TestTrail() (0 until 25).foreach{ iter => println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest() + val configs: Array[Configuration] = solver.suggest val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index b97dc8ae0..0a1ec3bfe 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -21,15 +21,14 @@ package com.tencent.angel.spark.automl.tuner import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.tuner.surrogate.NormalSurrogate import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector object GridTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val cs: ConfigurationSpace = new ConfigurationSpace("cs") @@ -37,9 +36,9 @@ object GridTunerExample extends App { cs.addParam(param2) cs.addParam(param3) cs.addParam(param4) - val solver: Solver = Solver(cs, train = false) + val solver: Solver = Solver(cs, surrogate = "Grid") val trail: Trail = new TestTrail() - val configs: Array[Configuration] = solver.suggest(grid = true) + val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) val result: (Vector, Double) = solver.optimal diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index 3a6d56426..e2ea0cbd4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -36,7 +36,7 @@ object RandomTunerExample extends App { cs.addParam(param2) cs.addParam(param3) cs.addParam(param4) - val solver: Solver = Solver(cs, train = false) + val solver: Solver = Solver(cs, surrogate = "Random") val trail: Trail = new TestTrail() (0 until 25).foreach{ iter => println(s"------iteration $iter starts------") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala index 5face691c..6912b34f2 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala @@ -24,7 +24,7 @@ class TunerParam { object TunerParam { var batchSize: Int = 1 - var sampleSize: Int = 1000* batchSize + var sampleSize: Int = 10* batchSize var taskName: String = "com.tencent.angel.spark.automl.tuner.trail.TestRunner" diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 505a6f5bc..e9b661eef 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -115,13 +115,27 @@ class ConfigurationSpace( def isValid(vec: Vector): Boolean = !preX.contains(vec) - def gridSample(): Array[Configuration] = { + def grid_sample(): Array[Configuration] = { var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] +// var missing:Int = 1 +// +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// missing = missing*param.getValues.size +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } +// val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] val params = getParams() - params.foreach { tmp += _.getValues } + params.foreach{case (param) => + tmp+=param.getValues + } + var params_array:Array[Array[Double]] = tmp.toArray +// println(params_array.deep.mkString("\n")) - val paramsArray: Array[Array[Double]] = tmp.toArray +// var params_vec: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) if (numParams==1){ var params_grid:Array[Double] = params_array(0) @@ -139,34 +153,59 @@ class ConfigurationSpace( configs.toArray } - else if (numParams == 2){ - val paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) + else if(numParams==2){ + var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach { tmp += Vectors.dense(_) } - val paramsVec: Array[Vector] = tmp.toArray - paramsVec.filter(isValid).foreach { vec => + params_grid.foreach{case (param) => + tmp+=Vectors.dense(param) + } + var params_vec: Array[Vector] = tmp.toArray + params_vec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } else{ - var paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) + var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) - paramsArray.foreach { a => - if (!(a sameElements paramsArray(0)) && !(a sameElements paramsArray(1))) { - paramsGrid = cartesian(paramsGrid, a) + params_array.foreach{case(a)=> + if (a != params_array(0) && a != params_array(1)){ + params_grid = cartesian(params_grid,a) } } var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach{ tmp += Vectors.dense(_) } - val paramsVec: Array[Vector] = tmp.toArray - paramsVec.filter(isValid).foreach { vec => + params_grid.foreach{case (param) => + tmp+=Vectors.dense(param) + } + var params_vec: Array[Vector] = tmp.toArray + params_vec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// param.getValues +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } +// +// param2Idx.foreach { case (paramName, paramIdx) => +// paramDict.get(paramName) match { +// case Some(param) => +// val params = List.fill(missing/param.getValues.size)(param.getValues) +// val params_Array = params.flatMap(_.toList).toArray +// +// params_Array.zipWithIndex.foreach { case (f: Double, i: Int) => +// vectors(i).toArray(paramIdx) = f +// } +// case None => LOG.info(s"Cannot find $paramName.") +// } +// } + } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala index 46e5aa002..dabee43b0 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala @@ -77,8 +77,11 @@ object BreezeOp { BDV(grads) } - def cartesian(A: Array[Double], B: Array[Double]): Array[Array[Double]] = for (a <- A; b <- B) yield { Array(a,b) } - - def cartesian(A: Array[Array[Double]], B: Array[Double]): Array[Array[Double]] = for (a <- A; b <- B) yield { (a.toBuffer += b).toArray } + def cartesian(A:Array[Double], B:Array[Double]) = for (a <- A; b <- B) yield { + Array(a,b) + } + def cartesian(A:Array[Array[Double]], B:Array[Double]) = for (a <- A; b <- B) yield { + (a.toBuffer+=b).toArray + } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 9dc8435bb..f543f08c2 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.tuner.solver - import com.tencent.angel.spark.automl.tuner.TunerParam import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} @@ -34,12 +33,15 @@ class Solver( val surrogate: Surrogate, val acqFuc: Acquisition, val optimizer: AcqOptimizer, - val train: Boolean = true) { + val train: Boolean = true, + val grid:Boolean = false) { val LOG: Log = LogFactory.getLog(classOf[Solver]) val PARAM_TYPES: Array[String] = Array("discrete", "continuous") + + def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate @@ -70,7 +72,7 @@ class Solver( /** * Suggests configurations to evaluate. */ - def suggest(grid:Boolean = false): Array[Configuration] = { + def suggest(): Array[Configuration] = { if (train){ val acqAndConfig = optimizer.maximize(TunerParam.batchSize) println(s"suggest configurations:") @@ -132,21 +134,51 @@ object Solver { new Solver(cs, sur, acq, opt) } - def apply(cs: ConfigurationSpace, train: Boolean = false, minimize: Boolean = true): Solver = { - val sur: Surrogate = new NormalSurrogate(cs, minimize) - //although acq and opt have been defined, they'll be not be used in random-search and grid-search - val acq: Acquisition = new EI(sur, 0.1f) - val opt: AcqOptimizer = new RandomSearch(acq, cs) - new Solver(cs, sur, acq, opt, train) + def apply(cs: ConfigurationSpace, minimize: Boolean = true,surrogate: String): Solver = { + var sur: Surrogate = new GPSurrogate(cs, minimize) + var acq: Acquisition = new EI(sur, 0.1f) + var opt: AcqOptimizer = new RandomSearch(acq, cs) + var train:Boolean = true + var grid:Boolean = false + if(surrogate=="Grid"){ + sur= new NormalSurrogate(cs, minimize) + acq = new EI(sur, 0.1f) + opt = new RandomSearch(acq, cs) + train = false + grid = true + }else if(surrogate=="Random"){ + sur = new NormalSurrogate(cs, minimize) + acq = new EI(sur, 0.1f) + opt = new RandomSearch(acq, cs) + train = false + grid = false + } + new Solver(cs, sur, acq, opt,train,grid) } - def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean): Solver = { + def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean, surrogate: String): Solver = { val cs: ConfigurationSpace = new ConfigurationSpace("cs") array.foreach(cs.addParam) - val sur: Surrogate = new GPSurrogate(cs, minimize) - val acq: Acquisition = new EI(sur, 0.1f) - val opt: AcqOptimizer = new RandomSearch(acq, cs) - new Solver(cs, sur, acq, opt) + var sur: Surrogate = new GPSurrogate(cs, minimize) + var acq: Acquisition = new EI(sur, 0.1f) + var opt: AcqOptimizer = new RandomSearch(acq, cs) + var train:Boolean = true + var grid:Boolean = false + if(surrogate=="Grid"){ + sur= new NormalSurrogate(cs, minimize) + acq = new EI(sur, 0.1f) + opt = new RandomSearch(acq, cs) + train = false + grid = true + }else if(surrogate=="Random"){ + sur = new NormalSurrogate(cs, minimize) + acq = new EI(sur, 0.1f) + opt = new RandomSearch(acq, cs) + train = false + grid = false + } + println(grid) + new Solver(cs, sur, acq, opt,train,grid) } def apply(minimize: Boolean): Solver = { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala index 5a82fa58f..de08c0971 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala @@ -27,9 +27,9 @@ class NormalSurrogate( override val minimize: Boolean = true)extends Surrogate(cs, minimize) { override def update(X: Array[Vector], Y: Array[Double]): Unit = { - preX ++= X - preY ++= Y - } + preX ++= X + preY ++= Y + } /** * NormalSurrogate is designed for random-search and grid-search diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala index 78010afee..7a6cd82ab 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TestRunner.scala @@ -18,7 +18,6 @@ package com.tencent.angel.spark.automl.tuner.trail - import com.github.fommil.netlib.{F2jBLAS, BLAS => NetlibBLAS} import com.tencent.angel.spark.automl.tuner.config.Configuration diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 3affe72ff..ee1b29e97 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -23,7 +23,7 @@ import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext -import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.utils.AutoMLException @@ -37,11 +37,15 @@ import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { +class AutoOfflineLearner(var tuneIter: Int = 20, minimize: Boolean = true,surrogate: String="GP") { // Shared configuration with Angel-PS val conf = SharedConf.get() + if(surrogate=="Grid"){ + tuneIter = 1 + } + // Some params var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) @@ -49,7 +53,9 @@ class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - val solver: Solver = Solver(minimize) + + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + val solver: Solver = Solver(cs, minimize,surrogate) // param name -> param type (continuous or discrete), value type (int, double,...) val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() @@ -197,16 +203,18 @@ class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { (0 until tuneIter).foreach{ iter => println(s"==========Tuner Iteration[$iter]==========") - val config: Configuration = solver.suggest()(0) - val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() - for (paramType <- paramType) { - setParam(paramType._1, paramType._2._2, config.get(paramType._1)) - paramMap += (paramType._1 -> config.get(paramType._1)) + val configs: Array[Configuration] = solver.suggest + for (config <- configs) { + val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() + for (paramType <- paramType) { + setParam(paramType._1, paramType._2._2, config.get(paramType._1)) + paramMap += (paramType._1 -> config.get(paramType._1)) + } + resetParam(paramMap) + model.resetParam(paramMap).graph.init(0) + val result = train(data, model) + solver.feed(config, result._1) } - resetParam(paramMap) - model.resetParam(paramMap).graph.init(0) - val result = train(data, model) - solver.feed(config, result._1) } val result: (Vector, Double) = solver.optimal solver.stop @@ -216,6 +224,8 @@ class AutoOfflineLearner(tuneIter: Int = 20, minimize: Boolean = true) { } + + def predict(input: String, output: String, modelInput: String, diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala deleted file mode 100644 index 8105a9114..000000000 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner_no_train.scala +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.ml.core - -import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} -import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} -import com.tencent.angel.ml.feature.LabeledData -import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} -import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace -import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.utils.AutoMLException -import com.tencent.angel.spark.context.PSContext -import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} -import com.tencent.angel.spark.ml.util.{DataLoader, SparkUtils} -import org.apache.spark.SparkContext -import org.apache.spark.ml.linalg.Vector -import org.apache.spark.rdd.RDD - -import scala.collection.mutable - -class AutoOfflineLearner_no_train(var tuneIter: Int = 20, minimize: Boolean = true, grid: Boolean = false) { - - // Shared configuration with Angel-PS - val conf = SharedConf.get() - if(grid){ - tuneIter = 1 - } - // Some params - var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) - var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) - var validationRatio: Double = conf.getDouble(MLConf.ML_VALIDATE_RATIO) - - println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - val solver: Solver = Solver(cs, train = false, minimize) - - // param name -> param type (continuous or discrete), value type (int, double,...) - val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() - - def addParam(param: ParamSpace[AnyVal]): this.type = { - solver.addParam(param) - this - } - - def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): this.type = { - paramType += name -> (pType.toLowerCase, vType.toLowerCase) - solver.addParam(pType, vType, name, config, seed) - this - } - - def setParam(name: String, vType: String, value: Double): Unit = { - println(s"set param[$name] type[$vType] value[$value]") - vType match { - case "int" => conf.setInt(name, value.toInt) - case "long" => conf.setLong(name, value.toLong) - case "float" => conf.setFloat(name, value.toFloat) - case "double" => conf.setDouble(name, value) - case _ => throw new AutoMLException(s"unsupported value type $vType") - } - } - - def resetParam(paramMap: mutable.Map[String, Double]): this.type = { - paramMap.foreach(println) - numEpoch = paramMap.getOrElse(MLConf.ML_EPOCH_NUM, numEpoch.toDouble).toInt - fraction = paramMap.getOrElse(MLConf.ML_BATCH_SAMPLE_RATIO, fraction) - validationRatio = paramMap.getOrElse(MLConf.ML_VALIDATE_RATIO, validationRatio) - println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - this - } - - def evaluate(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { - val scores = data.mapPartitions { case iter => - val output = model.forward(1, iter.toArray) - Iterator.single((output, model.graph.placeHolder.getLabel)) - } - (new AUC().cal(scores), new Precision().cal(scores)) - } - - def train(data: RDD[LabeledData], model: GraphModel): (Double, Double) = { - // split data into train and validate - val ratios = Array(1 - validationRatio, validationRatio) - val splits = data.randomSplit(ratios) - val train = splits(0) - val validate = splits(1) - - data.cache() - train.cache() - validate.cache() - - train.count() - validate.count() - data.unpersist() - - val numSplits = (1.0 / fraction).toInt - val manifold = OfflineLearner.buildManifold(train, numSplits) - - train.unpersist() - - var numUpdate = 1 - - var validateAuc = 0.0 - var validatePrecision = 0.0 - - for (epoch <- 0 until numEpoch) { - val batchIterator = OfflineLearner.buildManifoldIterator(manifold, numSplits) - while (batchIterator.hasNext) { - val (sumLoss, batchSize) = batchIterator.next().mapPartitions { case iter => - PSContext.instance() - val batch = iter.next() - model.forward(epoch, batch) - val loss = model.getLoss() - model.backward() - Iterator.single((loss, batch.length)) - }.reduce((f1, f2) => (f1._1 + f2._1, f1._2 + f2._2)) - - val (lr, boundary) = model.update(numUpdate, batchSize) - val loss = sumLoss / model.graph.taskNum - println(s"epoch=[$epoch] lr[$lr] batchSize[$batchSize] trainLoss=$loss") - if (boundary) { - var validateMetricLog = "" - if (validationRatio > 0.0) { - val metric = evaluate(validate, model) - validateAuc = metric._1 - validatePrecision = metric._2 - validateMetricLog = s"validateAuc=$validateAuc validatePrecision=$validatePrecision" - } - println(s"batch[$numUpdate] $validateMetricLog") - } - numUpdate += 1 - } - } - (validateAuc, validatePrecision) - } - - /** - * Predict the output with a RDD with data and a trained model - * @param data: examples to be predicted - * @param model: a trained model - * @return RDD[(label, predict value)] - * - */ - def predict(data: RDD[(LabeledData, String)], model: GraphModel): RDD[(String, Double)] = { - val scores = data.mapPartitions { iterator => - PSContext.instance() - val samples = iterator.toArray - val output = model.forward(1, samples.map(f => f._1)) - val labels = samples.map(f => f._2) - - (output, model.getLossFunc()) match { - case (mat :BlasDoubleMatrix, _: LogLoss) => - // For LogLoss, the output is (value, sigmoid(value), label) - (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1))).iterator - case (mat :BlasFloatMatrix, _: LogLoss) => - // For LogLoss, the output is (value, sigmoid(value), label) - (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 1).toDouble)).iterator - case (mat: BlasDoubleMatrix , _: L2Loss) => - // For L2Loss, the output is (value, _, _) - (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0))).iterator - case (mat: BlasFloatMatrix , _: L2Loss) => - // For L2Loss, the output is (value, _, _) - (0 until mat.getNumRows).map(idx => (labels(idx), mat.get(idx, 0).toDouble)).iterator - } - } - scores - } - - def train(input: String, - modelOutput: String, - modelInput: String, - dim: Int, - model: GraphModel): Unit = { - val conf = SparkContext.getOrCreate().getConf - val data = SparkContext.getOrCreate().textFile(input) - .repartition(SparkUtils.getNumCores(conf)) - .map(f => DataLoader.parseIntFloat(f, dim)) - - model.init(data.getNumPartitions) - - if (modelInput.length > 0) model.load(modelInput) - - (0 until tuneIter).foreach{ iter => - println(s"==========Tuner Iteration[$iter]==========") - val configs: Array[Configuration] = solver.suggest(grid) - for (config <- configs){ - val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() - for (paramType <- paramType) { - setParam(paramType._1, paramType._2._2, config.get(paramType._1)) - paramMap += (paramType._1 -> config.get(paramType._1)) - } - resetParam(paramMap) - model.resetParam(paramMap).graph.init(0) - val result = train(data, model) - solver.feed(config, result._1) - } - } - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - - //if (modelOutput.length > 0) model.save(modelOutput) - - } - - def predict(input: String, - output: String, - modelInput: String, - dim: Int, - model: GraphModel): Unit = { - val dataWithLabels = SparkContext.getOrCreate().textFile(input) - .map(f => (DataLoader.parseIntFloat(f, dim), DataLoader.parseLabel(f))) - - model.init(dataWithLabels.getNumPartitions) - model.load(modelInput) - - val predicts = predict(dataWithLabels, model) - if (output.length > 0) - predicts.map(f => s"${f._1} ${f._2}").saveAsTextFile(output) - } - -} - - - diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala similarity index 93% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala index 3988c934c..d6fb432e5 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTest extends PSFunSuite with SharedPSContext { +class AutoLRTestGP extends PSFunSuite with SharedPSContext { private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ @@ -15,7 +15,7 @@ class AutoLRTest extends PSFunSuite with SharedPSContext { override def beforeAll(): Unit = { super.beforeAll() - input = "../../data/census/census_148d_train.libsvm" + input = "../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala similarity index 83% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala index 5006aac1b..1cf6ce268 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Grid.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala @@ -5,17 +5,17 @@ import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression -import com.tencent.angel.spark.ml.core.AutoOfflineLearner_no_train +import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTest_Grid extends PSFunSuite with SharedPSContext { - private var learner: AutoOfflineLearner_no_train = _ +class AutoLRTestGrid extends PSFunSuite with SharedPSContext { + private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ override def beforeAll(): Unit = { super.beforeAll() - input = "../../data/census/census_148d_train.libsvm" + input = "../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -33,7 +33,7 @@ class AutoLRTest_Grid extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner_no_train(minimize = false, grid = true) + learner = new AutoOfflineLearner(minimize = false,surrogate = "Grid") learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,5",seed = 10) learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,5",seed = 20) } diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala similarity index 83% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala index 21b4695f0..2eb45c833 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTest_Random.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala @@ -5,17 +5,17 @@ import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression -import com.tencent.angel.spark.ml.core.AutoOfflineLearner_no_train +import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTest_Random extends PSFunSuite with SharedPSContext { - private var learner: AutoOfflineLearner_no_train = _ +class AutoLRTestRandom extends PSFunSuite with SharedPSContext { + private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ override def beforeAll(): Unit = { super.beforeAll() - input = "../../data/census/census_148d_train.libsvm" + input = "../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -33,7 +33,7 @@ class AutoLRTest_Random extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner_no_train(25,false, grid = false) + learner = new AutoOfflineLearner(2,false,"Random") learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100",seed = 10) learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,100",seed = 20) } From d91dcc46793910291693369a427b4e387043f4d9 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Wed, 20 Feb 2019 01:07:37 +0800 Subject: [PATCH 073/115] Update the configuration space and its use in the test cases. --- .../spark/automl/tuner/GPTunerExample.scala | 8 +- .../spark/automl/tuner/GridTunerExample.scala | 4 +- .../automl/tuner/RandomTunerExample.scala | 8 +- .../tuner/config/ConfigurationSpace.scala | 86 +++++-------------- .../spark/automl/tuner/solver/Solver.scala | 2 +- .../tencent/angel/spark/ml/AutoLRTestGP.scala | 3 +- .../angel/spark/ml/AutoLRTestGrid.scala | 4 +- .../angel/spark/ml/AutoLRTestRandom.scala | 4 +- 8 files changed, 38 insertions(+), 81 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 321118fd8..e491ef3f5 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -29,10 +29,10 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0",seed = 30) - val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1",seed = 40) + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") val solver: Solver = Solver(Array(param1, param2, param3, param4), true,surrogate ="GP") val trail: Trail = new TestTrail() (0 until 25).foreach{ iter => diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index 0a1ec3bfe..dea5aa30b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -27,8 +27,8 @@ import org.apache.spark.ml.linalg.Vector object GridTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) + val param1 = ParamSpace.fromConfigString("param1", "[1:10:10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val cs: ConfigurationSpace = new ConfigurationSpace("cs") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index e2ea0cbd4..d2b538651 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -27,10 +27,10 @@ import org.apache.spark.ml.linalg.Vector object RandomTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "0,10,11",seed = 10) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,11",seed = 20) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0",seed = 30) - val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1",seed = 40) + val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) + val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val cs: ConfigurationSpace = new ConfigurationSpace("cs") cs.addParam(param1) cs.addParam(param2) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index e9b661eef..d47060d08 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -115,97 +115,55 @@ class ConfigurationSpace( def isValid(vec: Vector): Boolean = !preX.contains(vec) - def grid_sample(): Array[Configuration] = { + def gridSample(): Array[Configuration] = { var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] -// var missing:Int = 1 -// -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// missing = missing*param.getValues.size -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } -// val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] - val params = getParams() - params.foreach{case (param) => - tmp+=param.getValues - } - var params_array:Array[Array[Double]] = tmp.toArray -// println(params_array.deep.mkString("\n")) -// var params_vec: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + val params = getParams() + params.foreach { tmp += _.getValues } - if (numParams==1){ - var params_grid:Array[Double] = params_array(0) -// println(params_grid.deep.mkString("\n")) + val paramsArray: Array[Array[Double]] = tmp.toArray + if (numParams == 1){ + val paramsGrid : Array[Array[Double]] = paramsArray var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach { tmp += Vectors.dense(_) } + val paramsVec = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } -// println(configs.toArray.deep.mkString("\n")) configs.toArray } - else if(numParams==2){ - var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + else if (numParams == 2){ + val paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec: Array[Vector] = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach { tmp += Vectors.dense(_) } + val paramsVec: Array[Vector] = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } else{ - var params_grid:Array[Array[Double]] = cartesian(params_array(0),params_array(1)) + var paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) - params_array.foreach{case(a)=> - if (a != params_array(0) && a != params_array(1)){ - params_grid = cartesian(params_grid,a) + paramsArray.foreach { a => + if (!(a sameElements paramsArray(0)) && !(a sameElements paramsArray(1))) { + paramsGrid = cartesian(paramsGrid, a) } } var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - params_grid.foreach{case (param) => - tmp+=Vectors.dense(param) - } - var params_vec: Array[Vector] = tmp.toArray - params_vec.filter(isValid).foreach { vec => + paramsGrid.foreach{ tmp += Vectors.dense(_) } + val paramsVec: Array[Vector] = tmp.toArray + paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray } -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// param.getValues -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } -// -// param2Idx.foreach { case (paramName, paramIdx) => -// paramDict.get(paramName) match { -// case Some(param) => -// val params = List.fill(missing/param.getValues.size)(param.getValues) -// val params_Array = params.flatMap(_.toList).toArray -// -// params_Array.zipWithIndex.foreach { case (f: Double, i: Int) => -// vectors(i).toArray(paramIdx) = f -// } -// case None => LOG.info(s"Cannot find $paramName.") -// } -// } - } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index f543f08c2..9333d6442 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -84,7 +84,7 @@ class Solver( } else { if(grid){ - val configs: Array[Configuration] = cs.grid_sample() + val configs: Array[Configuration] = cs.gridSample() configs } else { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala index d6fb432e5..f974c94db 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala @@ -34,8 +34,7 @@ class AutoLRTestGP extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) learner = new AutoOfflineLearner(25,false) - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100",seed = 10) - learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,100",seed = 20) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala index 1cf6ce268..f8c2d0200 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala @@ -34,8 +34,8 @@ class AutoLRTestGrid extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) learner = new AutoOfflineLearner(minimize = false,surrogate = "Grid") - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,5",seed = 10) - learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,5",seed = 20) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:5]",seed = 10) + learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "[0.1:1:5]",seed = 20) } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala index 2eb45c833..40db4e600 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala @@ -34,8 +34,8 @@ class AutoLRTestRandom extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) learner = new AutoOfflineLearner(2,false,"Random") - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "0.1,1,100",seed = 10) - learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "0.1,1,100",seed = 20) + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]",seed = 10) + learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "[0.1:1:100]",seed = 20) } override def afterAll(): Unit = { From 05e6b1becf3d4320ff6e896605a5d54760544a99 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 28 Feb 2019 14:15:42 +0800 Subject: [PATCH 074/115] cartesian product, vector filter --- data/a9a/a9a_123d_train_trans.libsvm | 32561 ++++++++++++++++ spark-on-angel/automl/pom.xml | 21 + .../spark/automl/feature/FeatureUtils.scala | 49 + .../feature/cross/FeatureCrossMeta.scala | 34 + .../automl/feature/cross/FeatureCrossOp.scala | 59 + .../feature/examples/FilterNonZero.scala | 67 + .../feature/examples/LassoSelector.scala | 60 + .../feature/examples/OneOrderCross.scala | 118 + .../feature/examples/TwoOrderCross.scala | 119 + .../spark/ml/feature/operator/Cartesian.scala | 42 + .../feature/operator/VectorFilterZero.scala | 158 + 11 files changed, 33288 insertions(+) create mode 100644 data/a9a/a9a_123d_train_trans.libsvm create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossMeta.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossOp.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala diff --git a/data/a9a/a9a_123d_train_trans.libsvm b/data/a9a/a9a_123d_train_trans.libsvm new file mode 100644 index 000000000..79b9ca9ee --- /dev/null +++ b/data/a9a/a9a_123d_train_trans.libsvm @@ -0,0 +1,32561 @@ +0 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 101:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 81:1 103:1 +0 1:1 7:1 16:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 18:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 26:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 24:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 40:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 46:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 +0 4:1 7:1 18:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 97:1 +1 5:1 9:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 18:1 27:1 35:1 45:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 43:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 68:1 72:1 74:1 77:1 79:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 2:1 9:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 82:1 87:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 80:1 88:1 +1 2:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 2:1 6:1 15:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 47:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 4:1 6:1 17:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 16:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 17:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 43:1 50:1 66:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 43:1 49:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 30:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 29:1 39:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 85:1 +1 4:1 7:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 9:1 17:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 44:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 25:1 38:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 40:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 100:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 30:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 34:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 31:1 35:1 41:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 112:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 57:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 48:1 65:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 3:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 31:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 117:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 109:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 15:1 29:1 39:1 40:1 61:1 68:1 72:1 75:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 108:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 79:1 110:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 25:1 38:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 71:1 73:1 74:1 76:1 78:1 111:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 59:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 15:1 25:1 38:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 96:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 49:1 66:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 24:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 27:1 35:1 40:1 53:1 63:1 70:1 73:1 74:1 77:1 80:1 86:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 28:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 21:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 41:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 11:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 107:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 68:1 73:1 74:1 77:1 80:1 98:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 42:1 56:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 16:1 22:1 36:1 42:1 60:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 +1 4:1 7:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 104:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 45:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 28:1 35:1 42:1 65:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 45:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 30:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 106:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 45:1 53:1 66:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 17:1 33:1 35:1 44:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 25:1 38:1 44:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 41:1 53:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 54:1 66:1 70:1 72:1 74:1 76:1 81:1 86:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 17:1 28:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 44:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 14:1 19:1 39:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 16:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 32:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 25:1 38:1 41:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 7:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 28:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 8:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 61:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 27:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 87:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 24:1 38:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 43:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 44:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 31:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 8:1 17:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +1 5:1 7:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 16:1 32:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 65:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 3:1 11:1 15:1 20:1 37:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 16:1 26:1 35:1 44:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 28:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 21:1 35:1 45:1 62:1 68:1 72:1 74:1 77:1 80:1 93:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 43:1 51:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 107:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 24:1 38:1 42:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 44:1 50:1 66:1 67:1 72:1 74:1 77:1 80:1 95:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 41:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 97:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 7:1 15:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 20:1 37:1 40:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 4:1 11:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 104:1 +1 5:1 8:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 45:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 4:1 7:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 43:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 114:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 18:1 25:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 54:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 70:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 85:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 7:1 18:1 21:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 14:1 29:1 39:1 45:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 99:1 +0 4:1 6:1 17:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 44:1 57:1 66:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 8:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 21:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 32:1 39:1 41:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 43:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 77:1 80:1 94:1 +0 5:1 6:1 18:1 33:1 35:1 41:1 49:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 26:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 15:1 20:1 37:1 41:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 90:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 24:1 38:1 40:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 82:1 93:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 45:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 34:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 41:1 49:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 31:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 14:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 44:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 44:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 11:1 18:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 91:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 118:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 81:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 29:1 39:1 45:1 50:1 64:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 27:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 8:1 15:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 21:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 24:1 38:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 15:1 24:1 38:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 82:1 110:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 15:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 32:1 39:1 45:1 52:1 64:1 68:1 73:1 74:1 76:1 82:1 94:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 17:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 103:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 17:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 44:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 16:1 20:1 37:1 41:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 101:1 +1 4:1 7:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 8:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 11:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 57:1 66:1 68:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 29:1 39:1 40:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 21:1 35:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 +1 4:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 15:1 19:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 16:1 22:1 36:1 41:1 64:1 68:1 72:1 74:1 76:1 81:1 94:1 +0 2:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 9:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 8:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 9:1 16:1 24:1 38:1 41:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 28:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 30:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 60:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 91:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 18:1 24:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 68:1 72:1 74:1 76:1 80:1 90:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 47:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 23:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 5:1 17:1 27:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 8:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 42:1 48:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 2:1 9:1 16:1 25:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 44:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 91:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 100:1 +0 4:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 17:1 20:1 37:1 43:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 41:1 51:1 65:1 67:1 73:1 74:1 77:1 82:1 96:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 27:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 77:1 80:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 9:1 17:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 31:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 14:1 22:1 36:1 41:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 24:1 38:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 117:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 16:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 54:1 66:1 69:1 73:1 74:1 76:1 81:1 88:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 49:1 61:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 31:1 35:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 9:1 17:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 41:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 21:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 3:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 52:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 94:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 10:1 14:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 43:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 33:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 +0 4:1 6:1 15:1 28:1 35:1 41:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 19:1 39:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 43:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 89:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 19:1 39:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 101:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 31:1 35:1 43:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 116:1 +0 2:1 7:1 15:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 18:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 7:1 17:1 28:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 85:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 70:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 17:1 24:1 38:1 40:1 61:1 71:1 72:1 74:1 76:1 78:1 111:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 18:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 99:1 +0 2:1 17:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 81:1 94:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 94:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 51:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 41:1 51:1 64:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 45:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 56:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 3:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 45:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 2:1 9:1 16:1 26:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 120:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 44:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 44:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 17:1 22:1 36:1 42:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 107:1 +0 3:1 10:1 15:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 42:1 57:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 42:1 57:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 19:1 39:1 45:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 2:1 9:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 92:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 70:1 73:1 74:1 77:1 80:1 +0 5:1 12:1 14:1 27:1 35:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 7:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 7:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 25:1 38:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 21:1 35:1 40:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 27:1 35:1 40:1 54:1 65:1 68:1 72:1 74:1 76:1 82:1 94:1 +1 1:1 6:1 17:1 22:1 36:1 40:1 47:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 43:1 52:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 22:1 36:1 41:1 59:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 21:1 35:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 115:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 21:1 35:1 43:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 45:1 52:1 64:1 68:1 73:1 75:1 76:1 80:1 84:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 31:1 35:1 41:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 16:1 24:1 38:1 46:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 81:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 26:1 35:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 1:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 16:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 50:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 65:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 31:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 45:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 58:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 43:1 59:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 97:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 9:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 18:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 91:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 11:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 1:1 14:1 28:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 45:1 48:1 65:1 71:1 72:1 74:1 76:1 79:1 107:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 32:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 33:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 4:1 11:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 21:1 35:1 43:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 90:1 +0 4:1 10:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 25:1 38:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 43:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 7:1 18:1 29:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 44:1 57:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 43:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 9:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 4:1 10:1 14:1 22:1 36:1 44:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 42:1 51:1 66:1 68:1 73:1 74:1 77:1 80:1 102:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 44:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 59:1 65:1 71:1 72:1 74:1 76:1 78:1 111:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 24:1 38:1 42:1 55:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 68:1 73:1 74:1 76:1 78:1 94:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 19:1 39:1 45:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 51:1 61:1 68:1 72:1 74:1 77:1 80:1 98:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 18:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 2:1 17:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 43:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 17:1 29:1 39:1 43:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 3:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 18:1 26:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 5:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 17:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 14:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 45:1 49:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 79:1 92:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 23:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 79:1 94:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 78:1 120:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 25:1 38:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 50:1 61:1 71:1 72:1 74:1 76:1 82:1 107:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 47:1 65:1 67:1 72:1 74:1 76:1 80:1 87:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 25:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 26:1 35:1 40:1 63:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 24:1 38:1 40:1 48:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 4:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 29:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 41:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 65:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 15:1 28:1 35:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 16:1 22:1 36:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 14:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 32:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 111:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 15:1 21:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 14:1 29:1 39:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 30:1 35:1 45:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 21:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 88:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 16:1 20:1 37:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 7:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 48:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 65:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 23:1 39:1 44:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 18:1 21:1 35:1 42:1 47:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 14:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 21:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 2:1 7:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 115:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 82:1 107:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 80:1 122:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 112:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 7:1 17:1 20:1 37:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +1 4:1 6:1 14:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 30:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 42:1 55:1 66:1 69:1 72:1 75:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 58:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 +1 3:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 65:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 115:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 92:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 21:1 35:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 77:1 82:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 92:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 29:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 49:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 29:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 28:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 91:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 23:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 21:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 82:1 87:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 15:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 59:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 34:1 35:1 44:1 48:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 9:1 14:1 22:1 36:1 46:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 45:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 15:1 29:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 88:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 44:1 58:1 64:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 50:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 45:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 54:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 17:1 25:1 38:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 15:1 23:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 99:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 47:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 34:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 51:1 66:1 71:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 14:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 27:1 35:1 44:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 105:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 21:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 112:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 56:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 91:1 +0 3:1 10:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 78:1 103:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 47:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 23:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 77:1 80:1 98:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 14:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 46:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 23:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 45:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 16:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 11:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 20:1 37:1 44:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 15:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 16:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 82:1 100:1 +0 5:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 56:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 33:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 24:1 38:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 31:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 17:1 28:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 120:1 +1 2:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 19:1 39:1 42:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 43:1 54:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 45:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 107:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 44:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 27:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 62:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 44:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 27:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 92:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 7:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 23:1 39:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 10:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 14:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 30:1 35:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 10:1 15:1 19:1 39:1 43:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 +0 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 11:1 17:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 25:1 38:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 121:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 16:1 24:1 38:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 40:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 3:1 6:1 14:1 21:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 41:1 48:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 114:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 56:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 28:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 44:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 15:1 25:1 38:1 40:1 50:1 63:1 70:1 73:1 74:1 77:1 82:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 45:1 56:1 64:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 82:1 107:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 54:1 66:1 70:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 112:1 +1 5:1 16:1 22:1 36:1 45:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 96:1 +1 4:1 6:1 17:1 32:1 39:1 44:1 52:1 66:1 67:1 73:1 75:1 76:1 80:1 96:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 43:1 53:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 24:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 49:1 65:1 69:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 34:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 119:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 65:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 17:1 21:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 104:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 29:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 18:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 5:1 6:1 17:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 11:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 64:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 18:1 27:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 19:1 39:1 42:1 64:1 68:1 73:1 74:1 76:1 78:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 45:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 42:1 51:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 34:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 8:1 15:1 25:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 69:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 69:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 4:1 7:1 17:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 78:1 101:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 5:1 6:1 18:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 47:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 59:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 3:1 6:1 18:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 88:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 4:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 65:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 51:1 66:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 11:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 14:1 25:1 38:1 40:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 70:1 72:1 74:1 76:1 78:1 88:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 19:1 39:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 42:1 59:1 65:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 17:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 46:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 114:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 15:1 31:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 9:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 14:1 22:1 36:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 40:1 52:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 19:1 39:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 49:1 61:1 69:1 72:1 74:1 76:1 78:1 103:1 +0 5:1 14:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 69:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 43:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 14:1 25:1 38:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 17:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 33:1 35:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 80:1 102:1 +1 5:1 9:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 14:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 85:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 112:1 +0 4:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 44:1 49:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 18:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 2:1 14:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 4:1 17:1 22:1 36:1 41:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 15:1 24:1 38:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 41:1 53:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 4:1 6:1 14:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 15:1 24:1 38:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 109:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 105:1 +1 5:1 11:1 18:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 26:1 35:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 45:1 47:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 82:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 8:1 16:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 31:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 92:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 79:1 101:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 43:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 98:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 78:1 93:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 88:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 82:1 121:1 +0 5:1 16:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 10:1 15:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 26:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 34:1 35:1 40:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 82:1 110:1 +0 5:1 17:1 19:1 39:1 44:1 65:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 11:1 14:1 20:1 37:1 41:1 59:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 7:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 96:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 27:1 35:1 42:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 109:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 45:1 47:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 79:1 102:1 +1 2:1 15:1 25:1 38:1 40:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 107:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 26:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 29:1 39:1 42:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 50:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 119:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 17:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 89:1 +0 2:1 6:1 14:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 28:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 9:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 14:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 43:1 55:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 9:1 17:1 27:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 31:1 35:1 41:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 +0 4:1 6:1 17:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 30:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 109:1 +1 3:1 7:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 5:1 7:1 17:1 20:1 37:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 55:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 7:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 43:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 2:1 8:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 19:1 39:1 42:1 62:1 68:1 73:1 74:1 76:1 82:1 98:1 +1 3:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 53:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 88:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 96:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 86:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 45:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 87:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 65:1 68:1 72:1 74:1 76:1 78:1 93:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 26:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 43:1 54:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 29:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 118:1 +0 5:1 9:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 14:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 2:1 11:1 14:1 22:1 36:1 41:1 59:1 62:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 16:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 82:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 31:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 3:1 9:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 101:1 +1 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +0 2:1 6:1 16:1 24:1 38:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 21:1 35:1 43:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 89:1 +0 1:1 8:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 48:1 65:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 19:1 39:1 41:1 51:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 79:1 90:1 +0 5:1 6:1 15:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 28:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 53:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 3:1 7:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 88:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 98:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 24:1 38:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 7:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 28:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 78:1 120:1 +0 5:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 41:1 57:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 68:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 15:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 29:1 39:1 45:1 52:1 64:1 68:1 72:1 74:1 76:1 78:1 94:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 57:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 26:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 25:1 38:1 42:1 52:1 65:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 41:1 59:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 110:1 +0 1:1 7:1 18:1 20:1 37:1 43:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 106:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 31:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 75:1 76:1 81:1 +0 4:1 7:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 6:1 18:1 26:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 26:1 35:1 40:1 55:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 24:1 38:1 40:1 52:1 61:1 71:1 72:1 75:1 76:1 80:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 32:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 24:1 38:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 47:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 5:1 7:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 114:1 +0 1:1 6:1 15:1 26:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 28:1 35:1 42:1 48:1 65:1 70:1 73:1 74:1 76:1 82:1 114:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 25:1 38:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 44:1 49:1 66:1 70:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 75:1 76:1 82:1 102:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 119:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 56:1 66:1 70:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 17:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 5:1 10:1 17:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 50:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 17:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 105:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 77:1 80:1 98:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 20:1 37:1 41:1 49:1 65:1 67:1 72:1 75:1 76:1 80:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 27:1 35:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 65:1 68:1 72:1 74:1 76:1 80:1 84:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 78:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 57:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 14:1 29:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 21:1 35:1 41:1 50:1 66:1 67:1 73:1 75:1 76:1 82:1 86:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 99:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 102:1 +1 3:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 16:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 31:1 35:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 41:1 55:1 65:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 68:1 72:1 74:1 77:1 80:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 107:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 71:1 72:1 74:1 77:1 78:1 83:1 +1 2:1 11:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 24:1 38:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 21:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 16:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 16:1 24:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 104:1 +1 4:1 6:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 53:1 65:1 67:1 72:1 74:1 76:1 80:1 95:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 78:1 102:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 24:1 38:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 21:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 41:1 52:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 44:1 51:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 29:1 39:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 44:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 86:1 +1 2:1 6:1 14:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 48:1 62:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 80:1 94:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 5:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 15:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 45:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 15:1 26:1 35:1 43:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 9:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 47:1 65:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 91:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 8:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 5:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 58:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 43:1 56:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 30:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 57:1 65:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 100:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 5:1 9:1 17:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 42:1 52:1 65:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 3:1 11:1 15:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 25:1 38:1 44:1 51:1 64:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 25:1 38:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 41:1 56:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 22:1 36:1 40:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 57:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 81:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 10:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 96:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 19:1 39:1 41:1 65:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 25:1 38:1 42:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 25:1 38:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 19:1 39:1 44:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 79:1 110:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 27:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 15:1 24:1 38:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 17:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 116:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 8:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 8:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 43:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 29:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 14:1 29:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 17:1 25:1 38:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 77:1 82:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 42:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 26:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 20:1 37:1 45:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 3:1 6:1 14:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 13:1 17:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 59:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 2:1 9:1 15:1 19:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 26:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 11:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 41:1 47:1 66:1 67:1 73:1 75:1 76:1 80:1 88:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 28:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 16:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 78:1 102:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 7:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 70:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 10:1 17:1 29:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 40:1 55:1 65:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 45:1 54:1 64:1 68:1 72:1 74:1 76:1 78:1 94:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 81:1 99:1 +0 3:1 6:1 14:1 28:1 35:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 21:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 45:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 112:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 69:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 8:1 14:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 73:1 74:1 76:1 79:1 100:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 31:1 35:1 45:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 91:1 +0 5:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 18:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 55:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 17:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 30:1 35:1 42:1 49:1 62:1 70:1 73:1 74:1 76:1 79:1 107:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +1 3:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 33:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 29:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 8:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 16:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 24:1 38:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 17:1 31:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 43:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 5:1 18:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 25:1 38:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 50:1 65:1 68:1 73:1 74:1 77:1 80:1 93:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 10:1 15:1 25:1 38:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 14:1 32:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 56:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 105:1 +1 4:1 8:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 17:1 33:1 35:1 40:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 24:1 38:1 40:1 55:1 61:1 69:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 65:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 29:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 +0 4:1 11:1 14:1 29:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 22:1 36:1 41:1 48:1 64:1 70:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 79:1 86:1 +0 5:1 6:1 18:1 30:1 35:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 114:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 14:1 19:1 39:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 43:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 41:1 57:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 23:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 58:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 17:1 30:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 87:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 47:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 24:1 38:1 44:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 81:1 94:1 +0 5:1 11:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 2:1 18:1 20:1 37:1 41:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 17:1 20:1 37:1 41:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 78:1 111:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 31:1 35:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 16:1 29:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 95:1 +0 3:1 7:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 92:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 45:1 52:1 65:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 16:1 30:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 8:1 16:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 43:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 45:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 107:1 +1 3:1 11:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 27:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 7:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 92:1 +0 4:1 8:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 26:1 35:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 61:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 92:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 43:1 52:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 45:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 43:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 +0 3:1 7:1 14:1 22:1 36:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 7:1 17:1 28:1 35:1 41:1 48:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 87:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 15:1 31:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 4:1 10:1 17:1 22:1 36:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 41:1 55:1 66:1 70:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 14:1 33:1 35:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 8:1 15:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 16:1 31:1 35:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 19:1 39:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 68:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 78:1 101:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 92:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 18:1 24:1 38:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 45:1 56:1 66:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 26:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 31:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 8:1 14:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 40:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 29:1 39:1 45:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 68:1 72:1 74:1 77:1 82:1 98:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 33:1 35:1 40:1 61:1 70:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 85:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 10:1 17:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 14:1 20:1 37:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 26:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 19:1 39:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 119:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 23:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 3:1 6:1 17:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 5:1 11:1 14:1 22:1 36:1 40:1 59:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 52:1 66:1 70:1 72:1 74:1 76:1 82:1 86:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 8:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 45:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 4:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 15:1 20:1 37:1 43:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 52:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 55:1 66:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 15:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 15:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 96:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 22:1 36:1 40:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 11:1 14:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 88:1 +0 3:1 6:1 16:1 22:1 36:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 118:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 86:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 87:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 47:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 4:1 8:1 18:1 27:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 51:1 66:1 67:1 72:1 75:1 76:1 82:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 82:1 94:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 61:1 69:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 17:1 20:1 37:1 43:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 43:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 18:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 20:1 37:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 77:1 80:1 111:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 92:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 20:1 37:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 34:1 35:1 40:1 56:1 65:1 67:1 73:1 75:1 76:1 78:1 103:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 42:1 50:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 5:1 10:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 31:1 35:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 44:1 51:1 66:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 43:1 49:1 66:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 24:1 38:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 19:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +1 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 16:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 16:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 44:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 17:1 19:1 39:1 42:1 64:1 68:1 72:1 74:1 76:1 82:1 110:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 24:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 2:1 11:1 17:1 23:1 39:1 42:1 52:1 64:1 68:1 73:1 75:1 76:1 82:1 90:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 15:1 21:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 50:1 62:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 88:1 +1 1:1 6:1 14:1 20:1 37:1 43:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 114:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 65:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 27:1 35:1 45:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 99:1 +0 3:1 17:1 25:1 38:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 16:1 29:1 39:1 41:1 50:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 96:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 43:1 55:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 5:1 8:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 93:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 101:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 92:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 17:1 20:1 37:1 43:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 16:1 28:1 35:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 101:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 3:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 52:1 62:1 70:1 72:1 74:1 76:1 82:1 101:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 52:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 21:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 15:1 26:1 35:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 45:1 56:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 44:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 98:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 69:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 41:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 43:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 4:1 11:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 31:1 35:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 87:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 65:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 16:1 28:1 35:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 25:1 38:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 17:1 24:1 38:1 43:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 34:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 96:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 41:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 28:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 14:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 112:1 +1 4:1 9:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 43:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 45:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 45:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 16:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 26:1 35:1 41:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 82:1 98:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 24:1 38:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 53:1 66:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 47:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 15:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 92:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 42:1 55:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 15:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 8:1 18:1 25:1 38:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 82:1 117:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 24:1 38:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 97:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 2:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 41:1 57:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 95:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 16:1 27:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 55:1 62:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 89:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 87:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 41:1 54:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 47:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 32:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 32:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 31:1 35:1 44:1 51:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 25:1 38:1 42:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 88:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 20:1 37:1 42:1 52:1 65:1 68:1 72:1 74:1 76:1 78:1 93:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 49:1 65:1 68:1 72:1 74:1 76:1 82:1 93:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 43:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 25:1 38:1 41:1 52:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 70:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 16:1 31:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 109:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 107:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 16:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 14:1 25:1 38:1 40:1 47:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 15:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 16:1 25:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 69:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 44:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 18:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 34:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 14:1 20:1 37:1 43:1 54:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 78:1 94:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 81:1 114:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 68:1 73:1 75:1 76:1 80:1 102:1 +0 2:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 32:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 97:1 +0 4:1 11:1 18:1 19:1 39:1 41:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 70:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 53:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 91:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 45:1 50:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 118:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 80:1 111:1 +1 3:1 11:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 105:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 11:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 30:1 35:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 82:1 103:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 58:1 65:1 67:1 72:1 74:1 77:1 78:1 103:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 43:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 3:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 1:1 6:1 15:1 27:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 20:1 37:1 42:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 24:1 38:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 15:1 27:1 35:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 29:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 68:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 24:1 38:1 41:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 104:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 114:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 42:1 59:1 62:1 69:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 8:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 17:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 3:1 10:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 18:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 80:1 96:1 +0 2:1 10:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 68:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 77:1 80:1 +1 4:1 6:1 15:1 28:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 103:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 45:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 43:1 56:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 9:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 5:1 7:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 50:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 19:1 39:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 18:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 17:1 22:1 36:1 42:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 14:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 82:1 87:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 57:1 62:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 82:1 117:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 28:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 9:1 17:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 85:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 29:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 15:1 31:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 50:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 80:1 109:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 120:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 43:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 43:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 42:1 55:1 66:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 43:1 48:1 66:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 47:1 63:1 68:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 30:1 35:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 43:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 112:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 92:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 44:1 48:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 16:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 27:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 58:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 26:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 111:1 +0 2:1 6:1 15:1 21:1 35:1 41:1 53:1 65:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 27:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 27:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 23:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 91:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 43:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 50:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 27:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 +1 3:1 10:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 44:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 80:1 +0 2:1 15:1 20:1 37:1 42:1 64:1 71:1 73:1 74:1 76:1 79:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 92:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 11:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 31:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 49:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 54:1 61:1 70:1 72:1 74:1 76:1 80:1 86:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 34:1 35:1 45:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 100:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 22:1 36:1 40:1 61:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 27:1 35:1 44:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 43:1 59:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 45:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 90:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 54:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 4:1 6:1 17:1 23:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 17:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 26:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 15:1 23:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 42:1 51:1 66:1 68:1 73:1 75:1 76:1 80:1 84:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 106:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 15:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 88:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 81:1 84:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 95:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 11:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 21:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 41:1 48:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 46:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 22:1 36:1 40:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 117:1 +0 2:1 6:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 21:1 35:1 42:1 50:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 5:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 94:1 +0 5:1 8:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 41:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 34:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 69:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 34:1 35:1 45:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 53:1 66:1 71:1 73:1 74:1 76:1 80:1 115:1 +0 1:1 14:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 2:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 121:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 70:1 73:1 74:1 76:1 80:1 90:1 +1 5:1 7:1 14:1 19:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 17:1 24:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 24:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 57:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 53:1 63:1 71:1 73:1 75:1 76:1 82:1 +0 5:1 6:1 16:1 24:1 38:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 116:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 42:1 49:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 18:1 25:1 38:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 17:1 20:1 37:1 40:1 55:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 19:1 39:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 82:1 87:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 24:1 38:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 9:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 31:1 35:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 91:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 8:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 41:1 52:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 44:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 86:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 56:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 33:1 35:1 40:1 54:1 61:1 68:1 72:1 74:1 77:1 82:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 57:1 66:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 44:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 5:1 6:1 14:1 20:1 37:1 43:1 51:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 119:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 40:1 50:1 61:1 68:1 72:1 74:1 76:1 78:1 +0 3:1 10:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 15:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 50:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 42:1 51:1 64:1 68:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 28:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 24:1 38:1 40:1 57:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 44:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 65:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 44:1 53:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 53:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 70:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 17:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 3:1 9:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 46:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 58:1 61:1 67:1 72:1 74:1 76:1 80:1 +0 2:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 59:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 32:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 17:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 16:1 29:1 39:1 45:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 1:1 8:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 50:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 54:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 92:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 45:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 45:1 50:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 86:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 113:1 +0 2:1 6:1 16:1 27:1 35:1 43:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 23:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 24:1 38:1 41:1 59:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 27:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 1:1 6:1 15:1 21:1 35:1 42:1 48:1 62:1 68:1 73:1 75:1 76:1 80:1 102:1 +1 2:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 58:1 65:1 71:1 72:1 74:1 76:1 82:1 101:1 +0 3:1 10:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 100:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 41:1 49:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 69:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 25:1 38:1 40:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 79:1 98:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 14:1 23:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 41:1 51:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 48:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 70:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 16:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 1:1 6:1 17:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 24:1 38:1 41:1 55:1 66:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 4:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 45:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 34:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 32:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 18:1 24:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 110:1 +0 3:1 9:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 59:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 95:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 43:1 49:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 19:1 39:1 40:1 64:1 70:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 24:1 38:1 45:1 56:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 +1 5:1 9:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 27:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 15:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 53:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 9:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 14:1 19:1 39:1 45:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 20:1 37:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 107:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 102:1 +1 5:1 18:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 23:1 39:1 40:1 52:1 61:1 68:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 48:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 99:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 17:1 25:1 38:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 43:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 8:1 15:1 32:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 91:1 +0 4:1 6:1 18:1 30:1 35:1 45:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 77:1 80:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 79:1 85:1 +0 2:1 6:1 15:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 1:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 54:1 65:1 68:1 72:1 74:1 76:1 81:1 94:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 3:1 11:1 14:1 28:1 35:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 70:1 73:1 75:1 76:1 82:1 86:1 +0 5:1 6:1 18:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 17:1 31:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 27:1 35:1 44:1 65:1 67:1 72:1 74:1 76:1 78:1 100:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 65:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 15:1 22:1 36:1 42:1 49:1 66:1 68:1 72:1 74:1 76:1 78:1 90:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 29:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 119:1 +0 5:1 18:1 31:1 35:1 44:1 65:1 68:1 72:1 74:1 76:1 78:1 94:1 +0 1:1 14:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 115:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 54:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 100:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 94:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 56:1 65:1 67:1 72:1 74:1 76:1 81:1 114:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 16:1 25:1 38:1 40:1 62:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 85:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 50:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 43:1 52:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 42:1 54:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 70:1 73:1 74:1 77:1 80:1 115:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 12:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 16:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 91:1 +0 2:1 9:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 17:1 27:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 15:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 92:1 +0 2:1 7:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 45:1 57:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 66:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 109:1 +0 2:1 11:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 14:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 117:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 95:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 21:1 35:1 42:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 28:1 35:1 42:1 62:1 68:1 72:1 74:1 76:1 78:1 88:1 +0 4:1 6:1 16:1 29:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 24:1 38:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 107:1 +0 2:1 10:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 4:1 10:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 23:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 29:1 39:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 58:1 64:1 68:1 72:1 74:1 76:1 81:1 117:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 91:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 2:1 7:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 65:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 5:1 10:1 16:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 57:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 15:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 +0 2:1 6:1 18:1 31:1 35:1 43:1 56:1 66:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 3:1 10:1 14:1 20:1 37:1 41:1 57:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 87:1 +0 3:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 49:1 66:1 68:1 72:1 74:1 76:1 82:1 94:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 22:1 36:1 44:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 29:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 82:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 65:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 67:1 72:1 75:1 76:1 80:1 115:1 +0 4:1 11:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 82:1 120:1 +0 4:1 9:1 15:1 25:1 38:1 43:1 47:1 64:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 15:1 31:1 35:1 43:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 32:1 39:1 45:1 49:1 64:1 67:1 73:1 75:1 76:1 82:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 27:1 35:1 41:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 15:1 22:1 36:1 44:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 42:1 47:1 64:1 68:1 73:1 74:1 76:1 78:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 24:1 38:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 33:1 35:1 41:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 111:1 +0 2:1 9:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 42:1 47:1 64:1 71:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 8:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 55:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 10:1 16:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 23:1 39:1 45:1 66:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 54:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 45:1 56:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 7:1 14:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 111:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 107:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 75:1 76:1 80:1 121:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 119:1 +0 1:1 6:1 15:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 11:1 16:1 28:1 35:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 24:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 49:1 66:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 2:1 15:1 21:1 35:1 42:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 44:1 48:1 66:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 2:1 6:1 17:1 28:1 35:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 24:1 38:1 41:1 59:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 30:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 77:1 80:1 88:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 107:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 111:1 +1 4:1 9:1 14:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 43:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 101:1 +1 4:1 8:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 90:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 48:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 8:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 87:1 +0 1:1 8:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 14:1 25:1 38:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 5:1 6:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 42:1 55:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 112:1 +0 5:1 8:1 17:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 32:1 39:1 40:1 52:1 64:1 68:1 73:1 75:1 76:1 80:1 94:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 40:1 54:1 65:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 43:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 44:1 49:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 14:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 77:1 80:1 110:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 54:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 45:1 56:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 50:1 66:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 95:1 +1 4:1 7:1 15:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 96:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 110:1 +0 5:1 7:1 18:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 8:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 51:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 49:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 85:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 40:1 48:1 61:1 70:1 72:1 74:1 76:1 82:1 114:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 4:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 29:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 40:1 59:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 26:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 24:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 58:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 43:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 69:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 3:1 8:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 26:1 35:1 44:1 53:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 45:1 52:1 65:1 67:1 73:1 74:1 76:1 79:1 86:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 5:1 6:1 17:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 41:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 25:1 38:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 110:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 26:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 65:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 18:1 32:1 39:1 45:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 40:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 44:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 96:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 31:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 86:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 101:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 45:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 43:1 58:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 80:1 122:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 105:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 82:1 93:1 +0 2:1 6:1 15:1 26:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 99:1 +0 1:1 11:1 15:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 40:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 78:1 93:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 45:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 105:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 51:1 64:1 67:1 73:1 74:1 77:1 81:1 85:1 +1 5:1 6:1 16:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 16:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 69:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 49:1 65:1 68:1 73:1 74:1 76:1 79:1 98:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 14:1 22:1 36:1 44:1 48:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 88:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 90:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 34:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 121:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 18:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 16:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 10:1 14:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 1:1 11:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 56:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 68:1 73:1 74:1 76:1 78:1 86:1 +1 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 41:1 48:1 64:1 71:1 73:1 74:1 77:1 82:1 +1 3:1 7:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 17:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 59:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 45:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 80:1 93:1 +1 4:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 42:1 56:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 33:1 35:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 86:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 24:1 38:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 19:1 39:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 8:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 7:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 16:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 19:1 39:1 45:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 86:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 21:1 35:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 29:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 85:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 5:1 7:1 16:1 33:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 59:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 33:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 68:1 73:1 75:1 76:1 80:1 98:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 109:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 42:1 55:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 16:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 40:1 52:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 11:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 21:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 11:1 14:1 25:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 100:1 +1 4:1 8:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 49:1 64:1 68:1 72:1 74:1 76:1 79:1 117:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 3:1 9:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 92:1 +0 5:1 9:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 33:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 24:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 31:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 18:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 21:1 35:1 44:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 43:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 20:1 37:1 44:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 40:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 42:1 55:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 30:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 5:1 14:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 24:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 66:1 68:1 72:1 74:1 76:1 78:1 98:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 90:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 20:1 37:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 11:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 62:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 4:1 8:1 16:1 19:1 39:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 82:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 50:1 61:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 70:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 26:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 47:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 65:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 43:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 17:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 8:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 17:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 112:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 119:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 13:1 16:1 27:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 1:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 14:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 15:1 22:1 36:1 41:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 4:1 11:1 15:1 20:1 37:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 17:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 99:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 31:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 45:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 7:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 31:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 42:1 59:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 9:1 14:1 25:1 38:1 44:1 49:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 88:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 18:1 33:1 35:1 45:1 57:1 66:1 70:1 73:1 74:1 76:1 78:1 119:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 57:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 45:1 55:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 47:1 62:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 18:1 25:1 38:1 45:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 44:1 52:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 4:1 10:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 2:1 14:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 88:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 28:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 4:1 9:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 109:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 34:1 35:1 40:1 54:1 61:1 68:1 72:1 75:1 76:1 80:1 84:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 28:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 65:1 68:1 72:1 74:1 76:1 80:1 94:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 87:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 18:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 32:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 87:1 +1 5:1 7:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 18:1 24:1 38:1 42:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 14:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 20:1 37:1 43:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 9:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 53:1 65:1 68:1 73:1 74:1 76:1 81:1 98:1 +0 3:1 6:1 15:1 23:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 4:1 7:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 56:1 64:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 68:1 72:1 74:1 77:1 80:1 98:1 +0 5:1 7:1 17:1 20:1 37:1 44:1 56:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 77:1 82:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 17:1 19:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 17:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 107:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 30:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 82:1 86:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 28:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 41:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 111:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 19:1 39:1 42:1 59:1 64:1 71:1 73:1 74:1 77:1 80:1 86:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 11:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 95:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 45:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 34:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 121:1 +0 3:1 11:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 47:1 64:1 68:1 73:1 74:1 77:1 80:1 90:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 2:1 7:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 14:1 24:1 38:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 26:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 33:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 42:1 48:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 78:1 110:1 +1 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 11:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 +0 5:1 10:1 16:1 33:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 46:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 23:1 39:1 45:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 24:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 28:1 35:1 42:1 62:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 45:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 31:1 35:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 15:1 31:1 35:1 41:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 78:1 101:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 58:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 32:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 32:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 43:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 14:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 51:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 29:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 77:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 75:1 76:1 80:1 102:1 +0 3:1 7:1 14:1 22:1 36:1 43:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 15:1 22:1 36:1 43:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 +1 5:1 9:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 80:1 110:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 14:1 19:1 39:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 45:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 111:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 21:1 35:1 41:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 41:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 84:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 33:1 35:1 40:1 49:1 63:1 70:1 73:1 75:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 119:1 +0 4:1 9:1 15:1 19:1 39:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 8:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 29:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 41:1 52:1 62:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 104:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 112:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 93:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 26:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 45:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 111:1 +1 4:1 7:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 41:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 56:1 65:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 29:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 54:1 62:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 18:1 33:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 18:1 34:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 24:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 75:1 76:1 80:1 98:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 5:1 11:1 15:1 31:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 10:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 53:1 64:1 67:1 73:1 75:1 76:1 82:1 100:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 28:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 70:1 73:1 74:1 76:1 80:1 109:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 85:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 51:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 26:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 32:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 105:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 45:1 57:1 64:1 70:1 73:1 74:1 76:1 82:1 90:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 30:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 28:1 35:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 87:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 41:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 85:1 +1 5:1 8:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 4:1 6:1 14:1 20:1 37:1 43:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 41:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 20:1 37:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 46:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 8:1 17:1 31:1 35:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 105:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 33:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 78:1 122:1 +0 4:1 11:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 25:1 38:1 44:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 82:1 99:1 +1 3:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 15:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 105:1 +1 2:1 9:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 95:1 +0 2:1 11:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 103:1 +1 4:1 9:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 45:1 56:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 33:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 2:1 9:1 15:1 22:1 36:1 40:1 53:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 1:1 15:1 20:1 37:1 42:1 64:1 68:1 73:1 75:1 76:1 82:1 93:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 122:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 43:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 106:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 27:1 35:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 10:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 43:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 65:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 18:1 26:1 35:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 41:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 99:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 80:1 +1 5:1 10:1 14:1 22:1 36:1 40:1 52:1 65:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 11:1 15:1 29:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 10:1 15:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 43:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 27:1 35:1 43:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 41:1 52:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 14:1 29:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 26:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 21:1 35:1 40:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 99:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 88:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 58:1 61:1 71:1 72:1 74:1 76:1 78:1 111:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 56:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 54:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 10:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 16:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 86:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 23:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 120:1 +1 5:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 91:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 15:1 32:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 43:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 10:1 17:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 90:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 18:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 100:1 +1 3:1 9:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 56:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 44:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 115:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 45:1 50:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 82:1 101:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 17:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 97:1 +0 2:1 6:1 18:1 30:1 35:1 42:1 56:1 64:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 45:1 49:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 19:1 39:1 45:1 64:1 68:1 72:1 74:1 76:1 78:1 110:1 +0 4:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 17:1 20:1 37:1 42:1 62:1 68:1 73:1 74:1 76:1 78:1 93:1 +1 3:1 7:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 69:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 26:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 118:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 45:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 57:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 113:1 +1 3:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 23:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 15:1 20:1 37:1 41:1 64:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 16:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 7:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 9:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 80:1 93:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 111:1 +0 3:1 7:1 17:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 32:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 119:1 +1 4:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 28:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +1 5:1 6:1 17:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 9:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 20:1 37:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 43:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 9:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 98:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 15:1 24:1 38:1 42:1 52:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 7:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 29:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 1:1 6:1 15:1 20:1 37:1 45:1 50:1 66:1 70:1 72:1 74:1 76:1 78:1 109:1 +0 1:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 79:1 93:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 1:1 6:1 18:1 31:1 35:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 14:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 48:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 43:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 118:1 +1 3:1 10:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 50:1 62:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 44:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 44:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 21:1 35:1 43:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 45:1 58:1 66:1 67:1 72:1 74:1 77:1 78:1 114:1 +1 1:1 6:1 18:1 22:1 36:1 40:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 91:1 +0 3:1 18:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 65:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 48:1 61:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 17:1 19:1 39:1 44:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 54:1 64:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 47:1 66:1 71:1 73:1 75:1 76:1 81:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 21:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 44:1 49:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 17:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 41:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 51:1 65:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 32:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 10:1 15:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 50:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 88:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 70:1 72:1 74:1 76:1 80:1 112:1 +1 5:1 7:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 31:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 49:1 65:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 15:1 22:1 36:1 41:1 64:1 68:1 72:1 74:1 76:1 81:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 14:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 23:1 39:1 43:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 33:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 24:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 46:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 26:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 43:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 29:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 18:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 3:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 109:1 +0 5:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 30:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 15:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 66:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 42:1 51:1 65:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 32:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 65:1 67:1 72:1 74:1 76:1 81:1 100:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 75:1 76:1 80:1 115:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 102:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 118:1 +0 3:1 7:1 16:1 31:1 35:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 121:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 28:1 35:1 40:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 52:1 66:1 68:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 101:1 +1 3:1 9:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 103:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 8:1 16:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 15:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 45:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 47:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 87:1 +0 5:1 6:1 16:1 31:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 121:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 78:1 91:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 71:1 73:1 74:1 77:1 80:1 120:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 1:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 58:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 68:1 73:1 74:1 76:1 81:1 91:1 +0 2:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 34:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 114:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 30:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 100:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 49:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 33:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 62:1 70:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 70:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 45:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 14:1 29:1 39:1 40:1 61:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 85:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 8:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 82:1 90:1 +0 3:1 10:1 15:1 19:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 42:1 57:1 64:1 68:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 4:1 7:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 107:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 15:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 106:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 33:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 21:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 41:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 7:1 16:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 44:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 48:1 66:1 68:1 72:1 74:1 76:1 80:1 93:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 17:1 20:1 37:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 41:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 28:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 19:1 39:1 42:1 52:1 64:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 16:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 25:1 38:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 20:1 37:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 81:1 93:1 +1 4:1 11:1 17:1 32:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 2:1 7:1 14:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 30:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 18:1 26:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 26:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 100:1 +1 3:1 8:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 43:1 51:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 87:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 43:1 55:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 101:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 65:1 67:1 72:1 74:1 76:1 80:1 102:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 43:1 56:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 44:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 30:1 35:1 44:1 53:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 98:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 26:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 30:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 3:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 33:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 45:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 66:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 77:1 79:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 30:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 41:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 +1 2:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 33:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 22:1 36:1 43:1 48:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 54:1 65:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 14:1 19:1 39:1 45:1 54:1 64:1 68:1 73:1 74:1 77:1 80:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 50:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 47:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 9:1 18:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 15:1 22:1 36:1 43:1 64:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 107:1 +0 4:1 6:1 18:1 33:1 35:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 79:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 5:1 9:1 14:1 21:1 35:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 87:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 81:1 +0 4:1 9:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 87:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 48:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 16:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 91:1 +1 3:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 77:1 78:1 113:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 42:1 49:1 62:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 65:1 68:1 72:1 74:1 76:1 78:1 93:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 95:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 86:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 79:1 +0 5:1 10:1 14:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 40:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 111:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 86:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 21:1 35:1 41:1 57:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 21:1 35:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 70:1 73:1 74:1 76:1 78:1 95:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 112:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 47:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 30:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 14:1 28:1 35:1 45:1 57:1 64:1 71:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 99:1 +0 5:1 9:1 16:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 48:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 112:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 121:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 46:1 48:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 94:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 14:1 20:1 37:1 41:1 66:1 69:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 24:1 38:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 85:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 42:1 47:1 62:1 68:1 73:1 75:1 76:1 79:1 94:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 21:1 35:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 122:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 41:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 7:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 87:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 57:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 8:1 15:1 30:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 32:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 28:1 35:1 44:1 53:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 81:1 88:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 4:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 29:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 79:1 94:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 27:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 18:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 9:1 18:1 31:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 43:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 53:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 9:1 18:1 19:1 39:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 95:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 65:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 25:1 38:1 42:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 41:1 50:1 66:1 68:1 72:1 74:1 76:1 82:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 16:1 24:1 38:1 42:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 54:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 9:1 15:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 58:1 66:1 70:1 72:1 74:1 76:1 80:1 114:1 +1 4:1 10:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 91:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 41:1 51:1 64:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 85:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 5:1 11:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 21:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 26:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 69:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 24:1 38:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 43:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 33:1 35:1 42:1 49:1 66:1 70:1 72:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 80:1 110:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 3:1 11:1 15:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 14:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 45:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 44:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 111:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 77:1 80:1 94:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 22:1 36:1 45:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 91:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 33:1 35:1 40:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 22:1 36:1 43:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 21:1 35:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 18:1 21:1 35:1 40:1 48:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 48:1 64:1 70:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 78:1 98:1 +1 4:1 7:1 16:1 32:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 23:1 39:1 45:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 68:1 73:1 74:1 76:1 78:1 93:1 +1 5:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 16:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 15:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 57:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 33:1 35:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 82:1 +1 5:1 8:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 52:1 61:1 70:1 72:1 74:1 76:1 78:1 86:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 82:1 98:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 100:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 42:1 60:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 17:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 24:1 38:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 56:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 43:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 15:1 24:1 38:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 41:1 51:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 26:1 35:1 40:1 61:1 68:1 72:1 74:1 76:1 80:1 122:1 +0 5:1 10:1 18:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 89:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 44:1 47:1 66:1 68:1 72:1 74:1 76:1 80:1 90:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 43:1 49:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 96:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 40:1 55:1 61:1 68:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 99:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 25:1 38:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 43:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 11:1 18:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 16:1 23:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 16:1 20:1 37:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 19:1 39:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 62:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 25:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 25:1 38:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 13:1 17:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 17:1 29:1 39:1 40:1 52:1 65:1 70:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 25:1 38:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 19:1 39:1 41:1 47:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 29:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 75:1 76:1 79:1 99:1 +0 3:1 10:1 15:1 25:1 38:1 42:1 51:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 43:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 8:1 18:1 29:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 8:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 9:1 18:1 29:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 92:1 +1 5:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 58:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 8:1 18:1 26:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 45:1 54:1 66:1 67:1 73:1 75:1 76:1 80:1 +0 2:1 9:1 18:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 17:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 114:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 41:1 48:1 64:1 70:1 73:1 74:1 76:1 79:1 107:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 47:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 21:1 35:1 42:1 59:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 17:1 33:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 4:1 6:1 18:1 33:1 35:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 56:1 65:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 44:1 51:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 94:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 32:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 43:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 18:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 28:1 35:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 79:1 111:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 33:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 20:1 37:1 41:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 88:1 +1 3:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 68:1 72:1 74:1 76:1 82:1 110:1 +1 3:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 58:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 7:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 77:1 81:1 +1 4:1 7:1 18:1 19:1 39:1 41:1 49:1 66:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 116:1 +0 1:1 11:1 15:1 22:1 36:1 40:1 59:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 9:1 18:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 29:1 39:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 105:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 43:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 16:1 31:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 5:1 9:1 16:1 19:1 39:1 41:1 47:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 85:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 119:1 +0 2:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 105:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 15:1 27:1 35:1 43:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 30:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 81:1 91:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 16:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 58:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 49:1 65:1 68:1 72:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 31:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 112:1 +1 3:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 81:1 +0 5:1 17:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 18:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 61:1 71:1 72:1 74:1 76:1 80:1 86:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 79:1 104:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 79:1 86:1 +0 5:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 110:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 113:1 +0 5:1 6:1 17:1 26:1 35:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 79:1 87:1 +1 1:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 20:1 37:1 43:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 25:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 45:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 29:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 21:1 35:1 40:1 61:1 68:1 72:1 74:1 76:1 80:1 108:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 44:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 44:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 18:1 20:1 37:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 33:1 35:1 40:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 19:1 39:1 46:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 44:1 56:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 85:1 +1 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 44:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 88:1 +0 5:1 6:1 14:1 21:1 35:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 57:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 66:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 24:1 38:1 41:1 57:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 26:1 35:1 43:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 29:1 39:1 42:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 75:1 76:1 80:1 108:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 9:1 17:1 25:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 43:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 77:1 80:1 93:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 18:1 31:1 35:1 41:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 44:1 51:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 88:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 62:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 3:1 9:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 12:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 8:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 57:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 33:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 17:1 28:1 35:1 45:1 53:1 64:1 70:1 73:1 74:1 76:1 82:1 107:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 7:1 15:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 42:1 47:1 64:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 16:1 21:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 45:1 47:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 30:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 109:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 25:1 38:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 106:1 +0 5:1 9:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 52:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 78:1 101:1 +0 5:1 8:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 45:1 54:1 66:1 71:1 73:1 74:1 76:1 82:1 111:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 +1 4:1 7:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 31:1 35:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 49:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 11:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 23:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 23:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 66:1 68:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 122:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 16:1 25:1 38:1 43:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 17:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 25:1 38:1 40:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 43:1 49:1 64:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 12:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 44:1 54:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 18:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 40:1 53:1 63:1 70:1 73:1 74:1 76:1 80:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 29:1 39:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 115:1 +1 2:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 15:1 26:1 35:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 45:1 52:1 65:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 16:1 21:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 32:1 39:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 45:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 107:1 +0 4:1 7:1 17:1 29:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 79:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 85:1 +0 4:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 9:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 55:1 62:1 69:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 40:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 4:1 6:1 18:1 30:1 35:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 100:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 27:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 17:1 21:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 79:1 101:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 14:1 20:1 37:1 41:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 16:1 19:1 39:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 96:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 51:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 45:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 42:1 53:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 5:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 17:1 24:1 38:1 41:1 55:1 66:1 68:1 73:1 74:1 77:1 80:1 98:1 +0 2:1 10:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 69:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 41:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 1:1 7:1 15:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 16:1 31:1 35:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +1 4:1 11:1 17:1 32:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 43:1 55:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 45:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 16:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 41:1 52:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 104:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 80:1 117:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 57:1 62:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 4:1 6:1 15:1 28:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 70:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 26:1 35:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 53:1 64:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 65:1 71:1 72:1 74:1 76:1 80:1 111:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 16:1 22:1 36:1 41:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 44:1 55:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 90:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 25:1 38:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 41:1 54:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 45:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 14:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 23:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 16:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 33:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 17:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 17:1 27:1 35:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 96:1 +1 5:1 11:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 30:1 35:1 40:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 5:1 6:1 16:1 26:1 35:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 9:1 18:1 19:1 39:1 42:1 60:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 20:1 37:1 40:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 79:1 89:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 70:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 50:1 65:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 65:1 70:1 72:1 74:1 76:1 78:1 112:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 9:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 109:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 47:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 65:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 51:1 63:1 69:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 49:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 91:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 115:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 19:1 39:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 69:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 70:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 21:1 35:1 42:1 56:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 32:1 39:1 41:1 55:1 65:1 70:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 3:1 9:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 57:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 88:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 28:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 31:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 41:1 51:1 62:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 53:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 81:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 32:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 90:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 27:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 43:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 106:1 +0 5:1 10:1 16:1 22:1 36:1 43:1 59:1 65:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 5:1 6:1 15:1 28:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 21:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 78:1 95:1 +0 4:1 6:1 16:1 24:1 38:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 91:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 2:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 43:1 52:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 9:1 17:1 20:1 37:1 45:1 55:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 16:1 32:1 39:1 42:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 28:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 48:1 65:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 69:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 28:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 25:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 3:1 11:1 17:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 14:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 25:1 38:1 41:1 56:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 45:1 55:1 62:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 19:1 39:1 42:1 64:1 71:1 73:1 74:1 76:1 81:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 44:1 49:1 65:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 14:1 26:1 35:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 34:1 35:1 42:1 58:1 64:1 68:1 72:1 74:1 76:1 82:1 98:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 9:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 33:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 44:1 49:1 66:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 44:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 7:1 16:1 27:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 34:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 41:1 59:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 29:1 39:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 55:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 55:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 68:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 62:1 70:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 16:1 29:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 22:1 36:1 44:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 42:1 50:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 21:1 35:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 29:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 18:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 8:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 99:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 85:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 15:1 20:1 37:1 41:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 26:1 35:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 4:1 9:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 43:1 48:1 65:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 17:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 14:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 12:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 106:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 70:1 72:1 74:1 76:1 79:1 86:1 +1 5:1 11:1 15:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 88:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 24:1 38:1 42:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 25:1 38:1 45:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 20:1 37:1 41:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 25:1 38:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 79:1 122:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 21:1 35:1 42:1 48:1 64:1 69:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 100:1 +0 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 27:1 35:1 44:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 29:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 53:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 11:1 17:1 23:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 85:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 43:1 54:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 8:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 109:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 49:1 63:1 68:1 73:1 75:1 76:1 82:1 90:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 75:1 76:1 82:1 93:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 53:1 64:1 70:1 73:1 74:1 76:1 80:1 107:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 24:1 38:1 41:1 48:1 62:1 69:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 79:1 97:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 45:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 46:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 3:1 6:1 18:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 105:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 19:1 39:1 43:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 17:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 59:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 43:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 65:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 45:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 42:1 51:1 64:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 45:1 47:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 31:1 35:1 44:1 57:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 81:1 85:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 59:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 16:1 22:1 36:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 43:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 24:1 38:1 41:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 10:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 77:1 82:1 93:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 4:1 6:1 17:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 14:1 32:1 39:1 42:1 52:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 49:1 61:1 68:1 72:1 75:1 76:1 82:1 98:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 3:1 6:1 17:1 26:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 119:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 4:1 7:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 113:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 119:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 43:1 50:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 116:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 95:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 44:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 77:1 78:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 45:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 16:1 21:1 35:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 42:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 32:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 42:1 58:1 66:1 67:1 72:1 74:1 76:1 79:1 115:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 90:1 +0 5:1 11:1 18:1 19:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 77:1 80:1 102:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 43:1 55:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 57:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 70:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 18:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 32:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 24:1 38:1 41:1 52:1 66:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 88:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 32:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 43:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 18:1 31:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 14:1 20:1 37:1 40:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 68:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 16:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 59:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 43:1 51:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 78:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 68:1 73:1 74:1 77:1 81:1 84:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 57:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 15:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 19:1 39:1 40:1 61:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 16:1 20:1 37:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 45:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 42:1 56:1 65:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 8:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 21:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 59:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 15:1 27:1 35:1 42:1 48:1 64:1 70:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 70:1 73:1 74:1 76:1 82:1 86:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 115:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 21:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 56:1 65:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 1:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 32:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 47:1 64:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 27:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 14:1 23:1 39:1 42:1 52:1 64:1 68:1 72:1 75:1 76:1 82:1 87:1 +1 4:1 10:1 16:1 29:1 39:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 80:1 94:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 18:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 97:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 28:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 41:1 51:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 86:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 48:1 65:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 88:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 24:1 38:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 28:1 35:1 44:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 27:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 82:1 103:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 24:1 38:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 33:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 21:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 2:1 17:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 28:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 42:1 51:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 50:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 100:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 54:1 61:1 70:1 72:1 74:1 76:1 80:1 86:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 33:1 35:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 4:1 8:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 43:1 47:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 40:1 58:1 65:1 67:1 72:1 74:1 76:1 79:1 100:1 +0 4:1 17:1 33:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 14:1 19:1 39:1 40:1 61:1 70:1 72:1 74:1 76:1 80:1 110:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 40:1 54:1 65:1 70:1 73:1 74:1 76:1 80:1 109:1 +0 2:1 10:1 17:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 87:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 87:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 113:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 87:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 88:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 43:1 57:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 30:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 10:1 17:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 16:1 24:1 38:1 41:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 43:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 51:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 99:1 +0 3:1 7:1 16:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 22:1 36:1 43:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 56:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 32:1 39:1 45:1 52:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 15:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 44:1 54:1 64:1 67:1 72:1 75:1 76:1 78:1 109:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 43:1 56:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 41:1 58:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 16:1 21:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 101:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 110:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 99:1 +0 5:1 10:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 24:1 38:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 45:1 57:1 65:1 68:1 73:1 74:1 77:1 82:1 90:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 75:1 76:1 80:1 110:1 +0 1:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 43:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 42:1 48:1 65:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 96:1 +1 3:1 10:1 17:1 19:1 39:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 85:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 40:1 56:1 63:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 11:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 45:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 54:1 65:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 11:1 18:1 28:1 35:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 4:1 7:1 14:1 28:1 35:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 102:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 44:1 48:1 66:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 5:1 6:1 18:1 33:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 95:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 9:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 54:1 65:1 70:1 72:1 74:1 76:1 79:1 109:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 10:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 43:1 51:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 45:1 53:1 62:1 67:1 73:1 74:1 77:1 80:1 107:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 119:1 +0 3:1 6:1 16:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 85:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 4:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 49:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 24:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 14:1 23:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 15:1 22:1 36:1 45:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 10:1 18:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 98:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 25:1 38:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 5:1 7:1 14:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 28:1 35:1 40:1 60:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 15:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 18:1 27:1 35:1 42:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 18:1 20:1 37:1 46:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 68:1 73:1 74:1 76:1 80:1 84:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 99:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 9:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 25:1 38:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 7:1 16:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 11:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 43:1 49:1 66:1 70:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 85:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 121:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 15:1 22:1 36:1 43:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 17:1 24:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 111:1 +0 3:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 17:1 26:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 52:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 45:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 50:1 61:1 69:1 72:1 75:1 76:1 80:1 93:1 +0 5:1 11:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 26:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 15:1 27:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 14:1 19:1 39:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 15:1 31:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 78:1 93:1 +0 4:1 7:1 17:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 118:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 24:1 38:1 40:1 50:1 61:1 70:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 31:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 49:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 7:1 17:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 28:1 35:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 17:1 22:1 36:1 40:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 16:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 57:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 16:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 99:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 53:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 26:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 41:1 52:1 65:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 16:1 20:1 37:1 45:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 119:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 75:1 76:1 80:1 +0 5:1 7:1 16:1 23:1 39:1 41:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 41:1 55:1 66:1 68:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 25:1 38:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 26:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 95:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 30:1 35:1 42:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 17:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 21:1 35:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 82:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 91:1 +0 1:1 6:1 17:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 69:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 81:1 106:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 86:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 9:1 18:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 59:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 31:1 35:1 43:1 57:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 15:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 43:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 31:1 35:1 40:1 48:1 62:1 70:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 105:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 10:1 18:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 115:1 +0 2:1 6:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 88:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 5:1 6:1 16:1 26:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 42:1 59:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 9:1 14:1 22:1 36:1 42:1 53:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 49:1 65:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 69:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 70:1 73:1 75:1 76:1 80:1 86:1 +0 4:1 6:1 16:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 85:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 5:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 24:1 38:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 24:1 38:1 42:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 8:1 17:1 28:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 40:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 115:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 42:1 50:1 66:1 70:1 72:1 74:1 76:1 79:1 107:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 28:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 17:1 19:1 39:1 40:1 61:1 71:1 72:1 74:1 76:1 79:1 +0 3:1 6:1 17:1 25:1 38:1 43:1 55:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 25:1 38:1 44:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 16:1 20:1 37:1 42:1 60:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 41:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 9:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 56:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 82:1 91:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 33:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 28:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 52:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 44:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 21:1 35:1 45:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 16:1 19:1 39:1 43:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 44:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 16:1 31:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 43:1 58:1 66:1 70:1 72:1 74:1 76:1 79:1 103:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 29:1 39:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 40:1 60:1 65:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 17:1 21:1 35:1 41:1 48:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 17:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 112:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 40:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 16:1 19:1 39:1 40:1 61:1 67:1 72:1 75:1 76:1 78:1 87:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 68:1 72:1 74:1 77:1 80:1 91:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 41:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 41:1 47:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 41:1 53:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 113:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 7:1 15:1 27:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 24:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 44:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 53:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 10:1 17:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 78:1 107:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +1 5:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 78:1 98:1 +1 5:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 43:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 46:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 57:1 64:1 70:1 73:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 15:1 25:1 38:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 +1 4:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 10:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 16:1 29:1 39:1 43:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 3:1 10:1 17:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 15:1 20:1 37:1 42:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 52:1 65:1 70:1 72:1 74:1 76:1 80:1 86:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 4:1 10:1 15:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 17:1 27:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 45:1 57:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 19:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 25:1 38:1 40:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 22:1 36:1 43:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 45:1 50:1 62:1 68:1 73:1 74:1 76:1 79:1 90:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 30:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 23:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 22:1 36:1 41:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 59:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 15:1 19:1 39:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 56:1 62:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 28:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 27:1 35:1 42:1 54:1 64:1 70:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 9:1 16:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 31:1 35:1 42:1 57:1 65:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 28:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 17:1 24:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 79:1 93:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 4:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 30:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 3:1 6:1 17:1 31:1 35:1 41:1 54:1 64:1 68:1 72:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 95:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 11:1 16:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 14:1 22:1 36:1 45:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 116:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 43:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 48:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 15:1 27:1 35:1 41:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 44:1 52:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 5:1 10:1 16:1 32:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 96:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 30:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 109:1 +0 4:1 10:1 18:1 25:1 38:1 41:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 89:1 +1 5:1 6:1 18:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 52:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 15:1 28:1 35:1 43:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 42:1 57:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 +0 5:1 11:1 18:1 29:1 39:1 41:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 32:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 18:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 14:1 31:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 45:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 107:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 59:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 5:1 10:1 17:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 14:1 24:1 38:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 42:1 59:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 26:1 35:1 41:1 62:1 69:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 2:1 8:1 14:1 20:1 37:1 43:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 28:1 35:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 121:1 +1 5:1 10:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 8:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 16:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 82:1 111:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 58:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 114:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 18:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 19:1 39:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 43:1 59:1 62:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 17:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 14:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 82:1 96:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 17:1 25:1 38:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 11:1 15:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 +0 4:1 6:1 18:1 28:1 35:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 45:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 50:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 16:1 25:1 38:1 40:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 45:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 86:1 +1 5:1 7:1 15:1 29:1 39:1 44:1 52:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 42:1 58:1 64:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 87:1 +0 5:1 10:1 18:1 28:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 25:1 38:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 24:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 42:1 58:1 66:1 67:1 72:1 74:1 76:1 80:1 112:1 +0 3:1 10:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 55:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 95:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 25:1 38:1 42:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 8:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 85:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 23:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 69:1 73:1 74:1 76:1 82:1 86:1 +0 4:1 9:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 70:1 72:1 74:1 76:1 78:1 103:1 +0 5:1 8:1 17:1 31:1 35:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 79:1 98:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 29:1 39:1 42:1 66:1 68:1 73:1 74:1 76:1 78:1 110:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 68:1 73:1 74:1 77:1 80:1 102:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 44:1 49:1 66:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 47:1 66:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 59:1 63:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 1:1 10:1 17:1 28:1 35:1 42:1 53:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 3:1 8:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 16:1 26:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 15:1 21:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 9:1 16:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 30:1 35:1 42:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 51:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 50:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 15:1 30:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 99:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 19:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 51:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 114:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 65:1 67:1 72:1 74:1 77:1 80:1 123:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 9:1 17:1 22:1 36:1 45:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 86:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 115:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 65:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 22:1 36:1 42:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 16:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 79:1 85:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 62:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 25:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 31:1 35:1 40:1 48:1 61:1 67:1 72:1 74:1 77:1 79:1 +0 5:1 7:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 15:1 31:1 35:1 42:1 48:1 66:1 71:1 73:1 74:1 76:1 82:1 111:1 +0 5:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 81:1 95:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 7:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 17:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 69:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 82:1 91:1 +0 5:1 6:1 14:1 22:1 36:1 43:1 50:1 64:1 69:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 59:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 17:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 40:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 21:1 35:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 4:1 6:1 17:1 27:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 45:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 16:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 44:1 51:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 18:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 22:1 36:1 45:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 41:1 55:1 66:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 44:1 58:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 22:1 36:1 45:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 59:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 54:1 64:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 24:1 38:1 40:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 15:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 58:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 24:1 38:1 41:1 50:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 45:1 57:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 18:1 21:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 17:1 29:1 39:1 40:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 112:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 57:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 45:1 55:1 62:1 70:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 10:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 45:1 56:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 56:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 7:1 16:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 32:1 39:1 45:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 122:1 +0 5:1 6:1 18:1 21:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 24:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 70:1 73:1 74:1 76:1 80:1 107:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 30:1 35:1 42:1 51:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 45:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 24:1 38:1 41:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 14:1 29:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 88:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 45:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 12:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 44:1 53:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 11:1 14:1 22:1 36:1 42:1 57:1 64:1 69:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 49:1 64:1 69:1 72:1 74:1 76:1 80:1 112:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 25:1 38:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 42:1 58:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 44:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 50:1 61:1 68:1 72:1 74:1 76:1 78:1 91:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 47:1 65:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 30:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 5:1 10:1 18:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 5:1 7:1 18:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 8:1 14:1 24:1 38:1 41:1 50:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 77:1 79:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 7:1 18:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 29:1 39:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 17:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 11:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 14:1 29:1 39:1 41:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 11:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 96:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 20:1 37:1 40:1 57:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 45:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 43:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 18:1 19:1 39:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 14:1 22:1 36:1 43:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 19:1 39:1 45:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 50:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 85:1 +1 4:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 79:1 111:1 +0 5:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 66:1 71:1 73:1 74:1 76:1 81:1 +1 5:1 8:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 42:1 48:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 49:1 61:1 68:1 72:1 75:1 76:1 82:1 91:1 +0 4:1 6:1 17:1 21:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 52:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 7:1 18:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 56:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 95:1 +0 4:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 23:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 13:1 15:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 27:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 41:1 52:1 64:1 68:1 72:1 74:1 76:1 82:1 102:1 +0 2:1 8:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 116:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 70:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 45:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 28:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 28:1 35:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 85:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 114:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 15:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 23:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 26:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 8:1 14:1 29:1 39:1 41:1 51:1 66:1 68:1 73:1 74:1 77:1 82:1 90:1 +0 2:1 6:1 15:1 31:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 65:1 67:1 73:1 74:1 76:1 79:1 105:1 +0 5:1 6:1 15:1 33:1 35:1 44:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 91:1 +0 5:1 6:1 14:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 16:1 22:1 36:1 40:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 18:1 34:1 35:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 78:1 103:1 +1 4:1 6:1 17:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 78:1 101:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 11:1 16:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 57:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 4:1 9:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 41:1 51:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 82:1 90:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 59:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 32:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 11:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 8:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 45:1 56:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 10:1 17:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 11:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 4:1 7:1 18:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 44:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 117:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 17:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 118:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 51:1 65:1 68:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 88:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 87:1 +0 1:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 59:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 75:1 76:1 82:1 94:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +0 5:1 7:1 16:1 19:1 39:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 105:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 28:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 16:1 21:1 35:1 43:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 3:1 6:1 17:1 26:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 66:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 25:1 38:1 45:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 28:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 28:1 35:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 79:1 117:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 29:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 56:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 45:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 79:1 111:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 27:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 26:1 35:1 42:1 56:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 +0 1:1 11:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +0 1:1 17:1 20:1 37:1 45:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 122:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 21:1 35:1 44:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 16:1 19:1 39:1 42:1 66:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 5:1 15:1 19:1 39:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 42:1 54:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 111:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 10:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 15:1 31:1 35:1 40:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 17:1 24:1 38:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 96:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 45:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 4:1 10:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 7:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 16:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 23:1 39:1 44:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 87:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 101:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 44:1 52:1 66:1 68:1 72:1 74:1 76:1 78:1 91:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 19:1 39:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 57:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 43:1 52:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 15:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 9:1 15:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 115:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 40:1 49:1 63:1 69:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 7:1 14:1 20:1 37:1 40:1 51:1 65:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 44:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 21:1 35:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 41:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 23:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 14:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 51:1 62:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 29:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 30:1 35:1 40:1 49:1 62:1 68:1 72:1 74:1 76:1 78:1 102:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 11:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 4:1 7:1 18:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 9:1 14:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 42:1 57:1 64:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 95:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 30:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 5:1 11:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 15:1 23:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 80:1 +1 3:1 9:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 47:1 64:1 69:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 14:1 25:1 38:1 40:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 58:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 41:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 111:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 47:1 66:1 68:1 72:1 74:1 76:1 80:1 90:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 49:1 64:1 70:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 95:1 +1 4:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 16:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 100:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 19:1 39:1 42:1 64:1 68:1 73:1 74:1 76:1 78:1 110:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 4:1 8:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 41:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 33:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 59:1 66:1 70:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 24:1 38:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 79:1 102:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 50:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 3:1 6:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 41:1 52:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 4:1 15:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 104:1 +0 2:1 6:1 16:1 31:1 35:1 43:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 11:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 56:1 65:1 71:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 62:1 68:1 72:1 74:1 76:1 78:1 110:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 18:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 34:1 35:1 45:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 113:1 +0 2:1 9:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +1 4:1 9:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 34:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 41:1 48:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 41:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 31:1 35:1 40:1 63:1 69:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 41:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 14:1 20:1 37:1 40:1 59:1 61:1 67:1 72:1 74:1 76:1 80:1 106:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 45:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 101:1 +0 3:1 9:1 17:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 41:1 48:1 66:1 68:1 73:1 74:1 76:1 81:1 96:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 45:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 106:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 45:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 117:1 +1 3:1 16:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 27:1 35:1 40:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 41:1 47:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 40:1 61:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 41:1 59:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 4:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 41:1 51:1 66:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 32:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 44:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 21:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 92:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 28:1 35:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 15:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 87:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 54:1 66:1 70:1 73:1 74:1 76:1 80:1 112:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 80:1 84:1 +1 5:1 7:1 16:1 19:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 30:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 48:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 18:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 70:1 72:1 74:1 77:1 80:1 +0 1:1 8:1 14:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 22:1 36:1 44:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 33:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 25:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 62:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 15:1 31:1 35:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 45:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 21:1 35:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 9:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 16:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 24:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 92:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 44:1 57:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 100:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 3:1 14:1 27:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 116:1 +0 2:1 7:1 18:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 30:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 104:1 +0 5:1 7:1 16:1 24:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 82:1 89:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 28:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 65:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 106:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 42:1 48:1 62:1 69:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 15:1 25:1 38:1 42:1 56:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 28:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 110:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 70:1 73:1 74:1 76:1 78:1 86:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 43:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 34:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 29:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 33:1 35:1 44:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 50:1 64:1 70:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 8:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 33:1 35:1 45:1 49:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 3:1 10:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 66:1 68:1 73:1 74:1 76:1 81:1 98:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 65:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 45:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 10:1 16:1 34:1 35:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 3:1 17:1 23:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 25:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 71:1 72:1 75:1 76:1 78:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 121:1 +0 3:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 112:1 +0 3:1 7:1 18:1 29:1 39:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 77:1 80:1 84:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 23:1 39:1 41:1 52:1 66:1 71:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 41:1 56:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 75:1 76:1 80:1 98:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 17:1 23:1 39:1 42:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 44:1 51:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 3:1 11:1 16:1 22:1 36:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 30:1 35:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 23:1 39:1 41:1 52:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 100:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 12:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 77:1 79:1 98:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 28:1 35:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 104:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 82:1 98:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 33:1 35:1 43:1 48:1 64:1 70:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 26:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 47:1 65:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 1:1 16:1 22:1 36:1 43:1 64:1 71:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 44:1 50:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 32:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 78:1 94:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 2:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 107:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 16:1 27:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 79:1 111:1 +0 5:1 10:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 41:1 47:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 78:1 94:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 11:1 14:1 22:1 36:1 40:1 49:1 61:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 78:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 41:1 56:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 26:1 35:1 40:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 112:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 34:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 3:1 8:1 16:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 45:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 99:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 118:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 31:1 35:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 48:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 12:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 14:1 23:1 39:1 42:1 64:1 68:1 73:1 75:1 76:1 81:1 91:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 41:1 55:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 106:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 56:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 70:1 72:1 74:1 76:1 82:1 114:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 9:1 17:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 29:1 39:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 104:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 29:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 43:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 30:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 114:1 +1 4:1 11:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 44:1 51:1 66:1 68:1 72:1 74:1 76:1 82:1 117:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 17:1 20:1 37:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 17:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 23:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 4:1 7:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 43:1 56:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 30:1 35:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 31:1 35:1 43:1 65:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 3:1 10:1 18:1 19:1 39:1 45:1 52:1 65:1 71:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 59:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 43:1 49:1 66:1 70:1 72:1 74:1 76:1 80:1 120:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 18:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 49:1 64:1 70:1 72:1 74:1 76:1 80:1 112:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 16:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 19:1 39:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 104:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 54:1 64:1 70:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 16:1 28:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 18:1 29:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 64:1 68:1 72:1 74:1 76:1 78:1 117:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 11:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 116:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 57:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 27:1 35:1 41:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 28:1 35:1 40:1 58:1 61:1 70:1 72:1 74:1 76:1 80:1 107:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 45:1 59:1 64:1 68:1 73:1 74:1 76:1 80:1 90:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 45:1 54:1 66:1 67:1 72:1 75:1 76:1 80:1 86:1 +0 4:1 6:1 14:1 21:1 35:1 45:1 54:1 66:1 68:1 72:1 74:1 76:1 80:1 93:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 25:1 38:1 44:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 56:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 56:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 26:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 9:1 17:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 53:1 63:1 71:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 34:1 35:1 45:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 114:1 +0 4:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 23:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 16:1 22:1 36:1 43:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 119:1 +0 5:1 18:1 19:1 39:1 40:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 80:1 94:1 +0 5:1 6:1 14:1 28:1 35:1 42:1 49:1 64:1 70:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 8:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 24:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 79:1 111:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 66:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 41:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 48:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 32:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 24:1 38:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 3:1 6:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 33:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 4:1 6:1 16:1 19:1 39:1 45:1 55:1 64:1 69:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 87:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 55:1 64:1 70:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 17:1 23:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 14:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 8:1 17:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 65:1 68:1 72:1 74:1 76:1 80:1 92:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 113:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +1 3:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 45:1 57:1 62:1 70:1 73:1 74:1 76:1 81:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 43:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 98:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 5:1 11:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 31:1 35:1 42:1 59:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 3:1 11:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 101:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 10:1 16:1 21:1 35:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 106:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 8:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 25:1 38:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 51:1 61:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 65:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 29:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 23:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 41:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 5:1 10:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 26:1 35:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 107:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 87:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 57:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 5:1 8:1 16:1 29:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 120:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 28:1 35:1 40:1 50:1 61:1 68:1 72:1 74:1 76:1 82:1 +1 3:1 8:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 22:1 36:1 45:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 65:1 68:1 72:1 74:1 76:1 78:1 93:1 +0 2:1 14:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 81:1 88:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 22:1 36:1 41:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 52:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 17:1 28:1 35:1 42:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 85:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 18:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 11:1 17:1 25:1 38:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 57:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 7:1 17:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 3:1 9:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 8:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 6:1 18:1 28:1 35:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 55:1 62:1 69:1 72:1 74:1 76:1 78:1 93:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 2:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 44:1 49:1 66:1 71:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 15:1 20:1 37:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 17:1 28:1 35:1 40:1 65:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 8:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 10:1 17:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 23:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 41:1 48:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 44:1 56:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 11:1 15:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 44:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 95:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 110:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 20:1 37:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 14:1 19:1 39:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 4:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 119:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 18:1 24:1 38:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 41:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 18:1 30:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 50:1 65:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 113:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 42:1 56:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 9:1 15:1 24:1 38:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 41:1 54:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 4:1 7:1 15:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 33:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 82:1 99:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 7:1 16:1 25:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 18:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 31:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 41:1 56:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 16:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 17:1 28:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 75:1 76:1 80:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 4:1 10:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 40:1 49:1 63:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 25:1 38:1 41:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 18:1 20:1 37:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 25:1 38:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 41:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 24:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 33:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 27:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 26:1 35:1 43:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 18:1 23:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 4:1 7:1 15:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 41:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 75:1 76:1 80:1 119:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 16:1 22:1 36:1 45:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 24:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 41:1 51:1 64:1 69:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 16:1 26:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 20:1 37:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 13:1 18:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 54:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 4:1 14:1 20:1 37:1 41:1 64:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 69:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 75:1 76:1 80:1 86:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 106:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 51:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 32:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 51:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 19:1 39:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 23:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 48:1 66:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 92:1 +1 5:1 10:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 41:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 22:1 36:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 2:1 7:1 14:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 96:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 19:1 39:1 42:1 64:1 68:1 73:1 74:1 76:1 78:1 110:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 1:1 7:1 14:1 20:1 37:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 17:1 21:1 35:1 41:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 15:1 29:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 58:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 1:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 58:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 14:1 22:1 36:1 43:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 15:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 16:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 9:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 27:1 35:1 45:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 44:1 54:1 65:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 44:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 70:1 72:1 74:1 76:1 81:1 +1 4:1 7:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 43:1 49:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 44:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 51:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 120:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 25:1 38:1 46:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 17:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 95:1 +1 2:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 30:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 114:1 +1 4:1 8:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 65:1 70:1 73:1 74:1 76:1 80:1 107:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 18:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 62:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 18:1 22:1 36:1 42:1 49:1 66:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 2:1 9:1 14:1 23:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 59:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 17:1 29:1 39:1 44:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 119:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 24:1 38:1 43:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 11:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 58:1 65:1 68:1 72:1 74:1 76:1 82:1 98:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 18:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 43:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 44:1 57:1 66:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 25:1 38:1 41:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 17:1 19:1 39:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 19:1 39:1 45:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 9:1 14:1 20:1 37:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 107:1 +0 3:1 8:1 15:1 19:1 39:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 41:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 7:1 16:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 103:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 45:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 1:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 77:1 78:1 +0 4:1 6:1 16:1 28:1 35:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 2:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 27:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 79:1 94:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 18:1 31:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 16:1 21:1 35:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 31:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 71:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 18:1 26:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 18:1 21:1 35:1 41:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 52:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 33:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 78:1 93:1 +0 3:1 8:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 112:1 +0 4:1 6:1 15:1 21:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 118:1 +1 5:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 70:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 40:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 3:1 7:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 18:1 31:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 95:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 42:1 50:1 64:1 71:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 7:1 14:1 22:1 36:1 42:1 50:1 65:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 57:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 31:1 35:1 42:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 16:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 5:1 9:1 18:1 28:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 48:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 45:1 59:1 64:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 10:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 45:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 58:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 3:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 43:1 55:1 64:1 71:1 72:1 74:1 76:1 81:1 101:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 68:1 72:1 74:1 76:1 81:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 122:1 +0 2:1 15:1 28:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 88:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 30:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 91:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 28:1 35:1 44:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 78:1 98:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 17:1 24:1 38:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 70:1 72:1 74:1 76:1 78:1 115:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 17:1 29:1 39:1 42:1 52:1 66:1 68:1 72:1 74:1 76:1 78:1 110:1 +1 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 18:1 19:1 39:1 44:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 14:1 27:1 35:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 86:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 27:1 35:1 45:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 17:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 28:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 3:1 7:1 17:1 19:1 39:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 112:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 53:1 64:1 68:1 72:1 74:1 76:1 82:1 111:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 26:1 35:1 43:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 119:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 20:1 37:1 40:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 18:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 69:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 90:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 80:1 110:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 119:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 34:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 11:1 17:1 20:1 37:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 19:1 39:1 41:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 44:1 48:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 16:1 20:1 37:1 41:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 117:1 +1 3:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 51:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 17:1 25:1 38:1 42:1 52:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 29:1 39:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 59:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 17:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 27:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 30:1 35:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 79:1 112:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 16:1 31:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 17:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 86:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 8:1 15:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 14:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 16:1 20:1 37:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 44:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 41:1 49:1 64:1 68:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 111:1 +1 2:1 6:1 16:1 24:1 38:1 43:1 51:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 18:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 71:1 72:1 74:1 77:1 80:1 120:1 +0 1:1 17:1 20:1 37:1 42:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 22:1 36:1 42:1 49:1 65:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 71:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 69:1 72:1 75:1 76:1 81:1 83:1 +1 4:1 7:1 14:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 81:1 94:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 22:1 36:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 17:1 24:1 38:1 43:1 50:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 69:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +1 5:1 15:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 10:1 17:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 70:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 14:1 25:1 38:1 41:1 59:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 21:1 35:1 44:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 68:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 15:1 32:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 43:1 56:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 24:1 38:1 41:1 55:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 21:1 35:1 41:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 9:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 22:1 36:1 41:1 47:1 66:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 1:1 7:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 43:1 48:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 22:1 36:1 41:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 4:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 15:1 29:1 39:1 41:1 51:1 64:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 5:1 7:1 14:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 18:1 26:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 26:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 82:1 121:1 +0 2:1 18:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 59:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 31:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 107:1 +1 3:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 65:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 34:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 112:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 31:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 11:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 12:1 16:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 45:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 42:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 91:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 51:1 62:1 70:1 73:1 74:1 76:1 78:1 121:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 18:1 28:1 35:1 43:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 32:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 79:1 101:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 11:1 17:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 2:1 7:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 24:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 24:1 38:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 53:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 15:1 21:1 35:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 4:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 34:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 68:1 73:1 74:1 77:1 78:1 93:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 121:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 1:1 11:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 59:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 9:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 40:1 61:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 31:1 35:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 1:1 7:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 3:1 7:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 14:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 25:1 38:1 41:1 47:1 66:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 2:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 7:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 121:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 23:1 39:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 70:1 73:1 74:1 76:1 80:1 90:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 24:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 99:1 +0 3:1 11:1 16:1 25:1 38:1 45:1 59:1 62:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 10:1 18:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 85:1 +0 2:1 6:1 14:1 31:1 35:1 43:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 +1 5:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 5:1 15:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 81:1 103:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 44:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 20:1 37:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 15:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 26:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 78:1 94:1 +0 4:1 9:1 18:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 22:1 36:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 17:1 27:1 35:1 43:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 44:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 50:1 62:1 69:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 26:1 35:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 4:1 8:1 15:1 19:1 39:1 40:1 50:1 65:1 68:1 73:1 74:1 76:1 81:1 90:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 45:1 49:1 64:1 68:1 73:1 74:1 76:1 79:1 94:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 19:1 39:1 42:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 54:1 65:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 50:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 100:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 56:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 17:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 119:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 52:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 45:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 18:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 48:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 106:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 112:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 9:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 34:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 3:1 8:1 15:1 20:1 37:1 41:1 50:1 66:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 24:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 43:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 34:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 77:1 80:1 94:1 +1 3:1 8:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 22:1 36:1 44:1 55:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 2:1 6:1 14:1 22:1 36:1 46:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 26:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 42:1 59:1 65:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 27:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 18:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 78:1 117:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 29:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 100:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 56:1 65:1 71:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 81:1 101:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 69:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 45:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 45:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 8:1 18:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 31:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 34:1 35:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 80:1 108:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 1:1 8:1 15:1 20:1 37:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 79:1 93:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 47:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 81:1 +1 4:1 6:1 16:1 28:1 35:1 40:1 55:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 21:1 35:1 41:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 44:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 50:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 45:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 24:1 38:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 3:1 7:1 15:1 27:1 35:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 9:1 15:1 21:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 16:1 27:1 35:1 43:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 19:1 39:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 5:1 6:1 18:1 31:1 35:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 23:1 39:1 42:1 52:1 66:1 67:1 73:1 75:1 76:1 81:1 88:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 44:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 28:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 43:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 88:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 33:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 16:1 19:1 39:1 42:1 51:1 62:1 68:1 73:1 74:1 76:1 79:1 110:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 14:1 19:1 39:1 40:1 61:1 70:1 72:1 75:1 76:1 82:1 +1 3:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 115:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 78:1 86:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 49:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 29:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 25:1 38:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 46:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 85:1 +0 5:1 10:1 17:1 29:1 39:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 42:1 47:1 64:1 71:1 73:1 75:1 76:1 80:1 85:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 10:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 85:1 +1 4:1 7:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 44:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 14:1 24:1 38:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 2:1 11:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 31:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 40:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 11:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 12:1 17:1 20:1 37:1 40:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 2:1 6:1 16:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 26:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 20:1 37:1 43:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 4:1 6:1 14:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 23:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 21:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 45:1 55:1 66:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 4:1 11:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 78:1 119:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 5:1 14:1 31:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +1 4:1 6:1 18:1 20:1 37:1 43:1 57:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 115:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 21:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 65:1 68:1 72:1 74:1 76:1 80:1 +1 4:1 10:1 16:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 20:1 37:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 24:1 38:1 42:1 53:1 64:1 71:1 73:1 74:1 77:1 80:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 16:1 20:1 37:1 40:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 114:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 80:1 96:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 34:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 44:1 48:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 10:1 17:1 29:1 39:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 107:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 70:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 100:1 +1 2:1 10:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 45:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 44:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 45:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 91:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 40:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 15:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 44:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 22:1 36:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 10:1 16:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 45:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 18:1 22:1 36:1 42:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 102:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 3:1 8:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 97:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 41:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 42:1 59:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 51:1 66:1 68:1 72:1 74:1 76:1 80:1 110:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 65:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 48:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 15:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 119:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 87:1 +0 2:1 8:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 87:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 23:1 39:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 43:1 50:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 18:1 29:1 39:1 40:1 60:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 45:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 49:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 50:1 66:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 61:1 68:1 72:1 75:1 76:1 78:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 19:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 27:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 16:1 26:1 35:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 56:1 63:1 68:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 44:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 106:1 +0 5:1 6:1 18:1 33:1 35:1 45:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 58:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 7:1 17:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 79:1 98:1 +0 3:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 53:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 29:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 45:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 90:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 43:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 47:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 27:1 35:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 45:1 56:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 40:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 16:1 28:1 35:1 43:1 64:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 58:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 34:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 122:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 43:1 50:1 64:1 68:1 73:1 74:1 76:1 82:1 91:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 105:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 32:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 16:1 32:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 45:1 51:1 66:1 68:1 72:1 74:1 76:1 78:1 108:1 +0 5:1 15:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 47:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 52:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 15:1 20:1 37:1 44:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 21:1 35:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 45:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 41:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 23:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 51:1 62:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 47:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +0 1:1 7:1 18:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 16:1 27:1 35:1 43:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 7:1 16:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 32:1 39:1 40:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 33:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 86:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 95:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 23:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 9:1 17:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 44:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 11:1 17:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 23:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 21:1 35:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 44:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 92:1 +1 4:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 43:1 58:1 65:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 5:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 18:1 20:1 37:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 25:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 55:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 9:1 16:1 22:1 36:1 45:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 41:1 54:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 30:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 112:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 109:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 115:1 +0 4:1 11:1 17:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 65:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 79:1 114:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 47:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 45:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 51:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 43:1 59:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 47:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 3:1 7:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 85:1 +0 2:1 6:1 17:1 24:1 38:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 26:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 18:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 77:1 80:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 29:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 41:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 29:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 20:1 37:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 112:1 +1 3:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 18:1 19:1 39:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 62:1 67:1 72:1 75:1 76:1 80:1 91:1 +1 4:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 101:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 21:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 4:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 25:1 38:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 21:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 5:1 9:1 16:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 95:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 9:1 15:1 20:1 37:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 89:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 45:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 +0 3:1 6:1 14:1 25:1 38:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 15:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 15:1 26:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 91:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 56:1 64:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 30:1 35:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 85:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 53:1 62:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 43:1 55:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 44:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 43:1 57:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 77:1 82:1 110:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 41:1 57:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 3:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 43:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 3:1 10:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 16:1 20:1 37:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 55:1 62:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 93:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 18:1 34:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 19:1 39:1 44:1 64:1 70:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 44:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 29:1 39:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 61:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 115:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 101:1 +0 5:1 10:1 17:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 16:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 2:1 8:1 15:1 19:1 39:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 96:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 22:1 36:1 43:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 +1 4:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 25:1 38:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 43:1 52:1 62:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 18:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 70:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 43:1 52:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 43:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 34:1 35:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 25:1 38:1 44:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 45:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 118:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 3:1 7:1 18:1 22:1 36:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 44:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 23:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 8:1 18:1 28:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 23:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 68:1 73:1 74:1 76:1 80:1 110:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 70:1 72:1 74:1 76:1 78:1 86:1 +0 2:1 9:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 70:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 25:1 38:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 9:1 17:1 21:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 43:1 52:1 65:1 71:1 72:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 15:1 20:1 37:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 101:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 19:1 39:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 27:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 45:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 78:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 3:1 6:1 14:1 30:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 119:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 44:1 52:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 43:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 5:1 10:1 16:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 33:1 35:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 24:1 38:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 43:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 119:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 4:1 7:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 25:1 38:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 9:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 24:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 45:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 104:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 21:1 35:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 91:1 +0 3:1 8:1 14:1 24:1 38:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 17:1 22:1 36:1 42:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 9:1 14:1 21:1 35:1 42:1 55:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 42:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 75:1 76:1 80:1 102:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 50:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 88:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 11:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 44:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 88:1 +0 2:1 6:1 16:1 30:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 50:1 65:1 70:1 72:1 74:1 76:1 78:1 103:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 20:1 37:1 44:1 51:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 16:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 79:1 101:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 21:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 78:1 +1 5:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 18:1 22:1 36:1 43:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 9:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 1:1 10:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 14:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 25:1 38:1 41:1 59:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 40:1 49:1 63:1 71:1 73:1 74:1 77:1 80:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 40:1 48:1 64:1 67:1 73:1 74:1 77:1 78:1 103:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 71:1 73:1 74:1 77:1 78:1 83:1 +0 5:1 11:1 16:1 25:1 38:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 43:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 102:1 +1 4:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 24:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 41:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 115:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 47:1 65:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 41:1 50:1 64:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 82:1 94:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 46:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 58:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 113:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 56:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 21:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 52:1 65:1 68:1 72:1 74:1 76:1 78:1 93:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 80:1 117:1 +0 2:1 7:1 14:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 14:1 28:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 5:1 11:1 18:1 32:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 92:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 17:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 42:1 49:1 65:1 70:1 72:1 74:1 76:1 80:1 119:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 19:1 39:1 46:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 26:1 35:1 41:1 48:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 53:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 28:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 43:1 47:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 16:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 21:1 35:1 43:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 2:1 11:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 97:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 58:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 9:1 16:1 19:1 39:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 +0 3:1 11:1 14:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 91:1 +0 5:1 7:1 15:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 15:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 14:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 16:1 28:1 35:1 40:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 34:1 35:1 44:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 10:1 16:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 8:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 16:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 91:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 87:1 +1 4:1 9:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 43:1 54:1 66:1 68:1 72:1 74:1 76:1 81:1 90:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 14:1 28:1 35:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 82:1 107:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 43:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 51:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 79:1 102:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 14:1 29:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 41:1 53:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 46:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 34:1 35:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 78:1 90:1 +1 4:1 6:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 94:1 +1 5:1 11:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 44:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 59:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 97:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 109:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 70:1 73:1 74:1 77:1 79:1 90:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 15:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 41:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 3:1 8:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 68:1 73:1 74:1 76:1 82:1 120:1 +0 2:1 6:1 17:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 41:1 51:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +0 3:1 6:1 17:1 19:1 39:1 45:1 49:1 64:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 82:1 108:1 +1 2:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 19:1 39:1 43:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 27:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 43:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 80:1 122:1 +0 4:1 6:1 15:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 92:1 +1 5:1 14:1 19:1 39:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 80:1 93:1 +0 5:1 6:1 17:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 45:1 51:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 43:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 121:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 47:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 17:1 25:1 38:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 17:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 59:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 75:1 76:1 82:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 41:1 50:1 66:1 67:1 73:1 75:1 76:1 82:1 103:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 22:1 36:1 45:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 106:1 +0 5:1 11:1 16:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 20:1 37:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 85:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 28:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 7:1 15:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 16:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 17:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 40:1 50:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 23:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 28:1 35:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +0 2:1 6:1 14:1 26:1 35:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 112:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 85:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 69:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 7:1 15:1 27:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 33:1 35:1 40:1 53:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 33:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 17:1 21:1 35:1 44:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 116:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 25:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 68:1 72:1 75:1 76:1 80:1 98:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 61:1 71:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 4:1 6:1 17:1 27:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 17:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 15:1 22:1 36:1 43:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 8:1 18:1 19:1 39:1 43:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 15:1 22:1 36:1 41:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 44:1 53:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 43:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 14:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 18:1 24:1 38:1 40:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 15:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 43:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 44:1 50:1 65:1 68:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 49:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 52:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 53:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 10:1 14:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 106:1 +0 2:1 10:1 16:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 2:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 68:1 73:1 74:1 77:1 80:1 93:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 70:1 73:1 75:1 76:1 80:1 112:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 26:1 35:1 43:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 45:1 53:1 64:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 8:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 5:1 8:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 85:1 +0 2:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 90:1 +0 2:1 10:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 44:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 59:1 63:1 71:1 73:1 75:1 76:1 79:1 101:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 17:1 20:1 37:1 41:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 29:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 18:1 25:1 38:1 44:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 56:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 33:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 81:1 108:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 28:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 12:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 113:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 43:1 55:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 97:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 15:1 25:1 38:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 23:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 53:1 66:1 68:1 72:1 74:1 76:1 82:1 93:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 47:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 28:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 68:1 73:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 82:1 109:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 44:1 58:1 64:1 68:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 30:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 59:1 62:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 26:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 18:1 23:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 43:1 47:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 20:1 37:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 93:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 42:1 52:1 65:1 68:1 72:1 74:1 76:1 80:1 117:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 75:1 76:1 78:1 90:1 +0 3:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 18:1 19:1 39:1 44:1 52:1 64:1 71:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 3:1 9:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 100:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 99:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 9:1 17:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 17:1 27:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 16:1 26:1 35:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 41:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 17:1 22:1 36:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 22:1 36:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 41:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 55:1 65:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 54:1 65:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 25:1 38:1 43:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 17:1 31:1 35:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 43:1 56:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 33:1 35:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 80:1 108:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 45:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 5:1 16:1 31:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 16:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 50:1 65:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 19:1 39:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 31:1 35:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 14:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 28:1 35:1 42:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 65:1 68:1 73:1 74:1 76:1 80:1 122:1 +1 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 44:1 54:1 66:1 67:1 72:1 74:1 76:1 81:1 104:1 +0 3:1 6:1 18:1 26:1 35:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 45:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 27:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 101:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 75:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 81:1 98:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 44:1 48:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 16:1 28:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 16:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 23:1 39:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 14:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 19:1 39:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 2:1 11:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 22:1 36:1 41:1 64:1 71:1 73:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 41:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 26:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 26:1 35:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 15:1 22:1 36:1 42:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 44:1 58:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +1 4:1 11:1 18:1 32:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 32:1 39:1 44:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 17:1 20:1 37:1 41:1 49:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 8:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 15:1 19:1 39:1 45:1 64:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 68:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 17:1 23:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 +1 3:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 88:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 54:1 62:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 24:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 28:1 35:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 28:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 86:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 30:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 44:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 44:1 49:1 65:1 67:1 72:1 75:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 15:1 19:1 39:1 41:1 55:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 26:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 81:1 104:1 +0 1:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 99:1 +1 2:1 7:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 33:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 43:1 51:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 16:1 20:1 37:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 45:1 48:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 30:1 35:1 42:1 49:1 64:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 43:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 10:1 15:1 32:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 70:1 73:1 75:1 76:1 82:1 90:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 59:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 14:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 9:1 16:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 86:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 16:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 68:1 72:1 74:1 76:1 81:1 108:1 +0 5:1 6:1 17:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 16:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 1:1 11:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 27:1 35:1 43:1 49:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 8:1 16:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 5:1 10:1 17:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 1:1 18:1 19:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 34:1 35:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 86:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 5:1 9:1 16:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 44:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 9:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 70:1 72:1 74:1 76:1 80:1 107:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 14:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 82:1 90:1 +0 4:1 6:1 15:1 19:1 39:1 43:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 3:1 6:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 43:1 56:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 21:1 35:1 43:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 115:1 +1 5:1 10:1 17:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 45:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 8:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 57:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 14:1 31:1 35:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 16:1 31:1 35:1 43:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 112:1 +0 5:1 6:1 14:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 17:1 33:1 35:1 45:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 118:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 22:1 36:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 89:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 +0 5:1 6:1 15:1 27:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 8:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 43:1 58:1 65:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 110:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 78:1 101:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 42:1 50:1 65:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 14:1 25:1 38:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 2:1 11:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 54:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 90:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 87:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 33:1 35:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 24:1 38:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 41:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 89:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 17:1 29:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 111:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 17:1 33:1 35:1 42:1 66:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +1 2:1 8:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 56:1 64:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 100:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 121:1 +0 4:1 6:1 18:1 21:1 35:1 43:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 9:1 17:1 25:1 38:1 41:1 48:1 64:1 69:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 92:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 90:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 105:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 25:1 38:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 44:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 80:1 88:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +1 4:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 45:1 50:1 62:1 70:1 72:1 74:1 76:1 78:1 107:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 +0 3:1 8:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 10:1 18:1 25:1 38:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 88:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 +1 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 33:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 17:1 27:1 35:1 40:1 61:1 67:1 72:1 75:1 76:1 81:1 86:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 57:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 16:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 44:1 56:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 24:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 33:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 15:1 28:1 35:1 41:1 55:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 29:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 33:1 35:1 42:1 47:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 70:1 72:1 74:1 76:1 78:1 109:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 32:1 39:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 47:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 59:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 70:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 65:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 90:1 +0 2:1 6:1 18:1 30:1 35:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 114:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 18:1 31:1 35:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 32:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 11:1 17:1 19:1 39:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 29:1 39:1 41:1 52:1 64:1 68:1 73:1 74:1 76:1 82:1 90:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 122:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 33:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 10:1 14:1 28:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 55:1 65:1 68:1 73:1 74:1 76:1 80:1 90:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 120:1 +0 5:1 12:1 16:1 20:1 37:1 45:1 56:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 14:1 33:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 82:1 85:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 43:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 11:1 17:1 19:1 39:1 44:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 17:1 19:1 39:1 44:1 52:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 33:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 59:1 64:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 41:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 5:1 15:1 22:1 36:1 41:1 64:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 3:1 11:1 14:1 29:1 39:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 95:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 14:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 71:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 121:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 114:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 24:1 38:1 42:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 48:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 21:1 35:1 41:1 52:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 27:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 42:1 53:1 66:1 68:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 51:1 65:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 41:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 14:1 22:1 36:1 43:1 57:1 66:1 68:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 11:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 14:1 27:1 35:1 42:1 49:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 78:1 102:1 +0 1:1 14:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 18:1 24:1 38:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 17:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 43:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 78:1 111:1 +1 3:1 9:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 27:1 35:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 15:1 20:1 37:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 59:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 84:1 +1 3:1 9:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 82:1 95:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 56:1 64:1 70:1 73:1 74:1 76:1 80:1 86:1 +0 4:1 10:1 18:1 28:1 35:1 40:1 49:1 65:1 67:1 72:1 74:1 76:1 79:1 103:1 +1 2:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 119:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 52:1 64:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 26:1 35:1 40:1 51:1 65:1 67:1 73:1 75:1 76:1 82:1 112:1 +0 1:1 16:1 19:1 39:1 42:1 64:1 68:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 51:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 +1 3:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 95:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 52:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 15:1 26:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 120:1 +1 4:1 9:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 17:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 18:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 28:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 58:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 27:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 45:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 15:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 65:1 68:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 17:1 20:1 37:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 57:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 31:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 10:1 16:1 25:1 38:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 17:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 45:1 53:1 64:1 69:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 116:1 +1 2:1 7:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 50:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 12:1 15:1 22:1 36:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 18:1 22:1 36:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 54:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 8:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 20:1 37:1 42:1 55:1 64:1 70:1 73:1 74:1 76:1 80:1 109:1 +1 4:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 45:1 50:1 66:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 56:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 78:1 120:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 16:1 25:1 38:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 55:1 64:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 3:1 8:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 16:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 107:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 44:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 31:1 35:1 41:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 7:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 40:1 51:1 63:1 68:1 73:1 75:1 76:1 80:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 28:1 35:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 33:1 35:1 42:1 58:1 65:1 67:1 72:1 75:1 76:1 80:1 119:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 27:1 35:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 24:1 38:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 51:1 66:1 68:1 73:1 74:1 76:1 80:1 93:1 +1 5:1 6:1 17:1 20:1 37:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 11:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 62:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 29:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 29:1 39:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 18:1 22:1 36:1 41:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 80:1 102:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 30:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 5:1 14:1 29:1 39:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 106:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 16:1 20:1 37:1 42:1 47:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 70:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 14:1 21:1 35:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 8:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 92:1 +0 2:1 6:1 17:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 15:1 20:1 37:1 41:1 59:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 109:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 45:1 53:1 65:1 68:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 41:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 57:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 26:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 17:1 19:1 39:1 40:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 33:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 17:1 25:1 38:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 6:1 17:1 24:1 38:1 43:1 48:1 66:1 68:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 9:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 71:1 73:1 74:1 76:1 79:1 101:1 +1 3:1 15:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 43:1 58:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 118:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 30:1 35:1 40:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 85:1 +0 5:1 6:1 18:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 77:1 78:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 21:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 106:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 4:1 7:1 15:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 43:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 22:1 36:1 43:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 44:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 2:1 7:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 15:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 8:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 25:1 38:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 57:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 79:1 +0 4:1 6:1 16:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 75:1 76:1 80:1 119:1 +0 2:1 14:1 31:1 35:1 43:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 53:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 18:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 17:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 7:1 18:1 20:1 37:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 45:1 49:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 57:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 16:1 22:1 36:1 42:1 59:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 44:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 7:1 14:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 15:1 22:1 36:1 40:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 30:1 35:1 44:1 50:1 65:1 67:1 73:1 74:1 76:1 81:1 103:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 16:1 24:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 42:1 54:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 23:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 43:1 58:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 29:1 39:1 42:1 64:1 67:1 72:1 74:1 76:1 79:1 87:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 49:1 64:1 71:1 72:1 74:1 76:1 78:1 101:1 +1 2:1 9:1 15:1 19:1 39:1 46:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 5:1 8:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 55:1 65:1 68:1 73:1 75:1 76:1 80:1 102:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 17:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 25:1 38:1 45:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 21:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 47:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 17:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 51:1 66:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 27:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 33:1 35:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 82:1 +1 4:1 9:1 17:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 25:1 38:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 8:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 17:1 26:1 35:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 45:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 17:1 24:1 38:1 45:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 19:1 39:1 41:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 3:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 80:1 114:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 14:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 42:1 50:1 64:1 71:1 73:1 74:1 76:1 80:1 +0 3:1 11:1 15:1 19:1 39:1 42:1 52:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 24:1 38:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 11:1 16:1 23:1 39:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 15:1 30:1 35:1 44:1 48:1 65:1 67:1 72:1 74:1 77:1 81:1 112:1 +0 4:1 7:1 14:1 25:1 38:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 28:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 24:1 38:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 17:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 29:1 39:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 24:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 45:1 48:1 65:1 68:1 72:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 9:1 16:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 10:1 17:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 10:1 18:1 20:1 37:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 19:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 15:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 16:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 16:1 27:1 35:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 23:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 16:1 25:1 38:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 18:1 26:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 65:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 17:1 33:1 35:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 30:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 6:1 14:1 27:1 35:1 41:1 58:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 19:1 39:1 42:1 52:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 51:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 40:1 52:1 63:1 70:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 17:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 29:1 39:1 42:1 52:1 66:1 67:1 73:1 74:1 76:1 81:1 +1 1:1 6:1 17:1 20:1 37:1 46:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 11:1 14:1 25:1 38:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 40:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 3:1 9:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 89:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 1:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 7:1 18:1 32:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 53:1 61:1 68:1 72:1 75:1 76:1 78:1 98:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 9:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 9:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 3:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 15:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 18:1 26:1 35:1 42:1 65:1 67:1 73:1 74:1 77:1 79:1 119:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 112:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 107:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 18:1 22:1 36:1 40:1 57:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 29:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 41:1 54:1 66:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 42:1 47:1 66:1 67:1 73:1 74:1 76:1 81:1 115:1 +1 4:1 6:1 15:1 25:1 38:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 5:1 10:1 16:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 14:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 11:1 18:1 20:1 37:1 40:1 51:1 61:1 71:1 72:1 74:1 76:1 80:1 120:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 18:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 15:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 11:1 18:1 20:1 37:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 120:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 8:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 7:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 49:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 24:1 38:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 22:1 36:1 42:1 51:1 66:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 29:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 69:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 18:1 21:1 35:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 41:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 92:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 119:1 +1 4:1 6:1 16:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 10:1 15:1 19:1 39:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 18:1 29:1 39:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 101:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 9:1 14:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 18:1 19:1 39:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 89:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 18:1 31:1 35:1 44:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 21:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 18:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 45:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 4:1 9:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 90:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 45:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 8:1 18:1 22:1 36:1 40:1 51:1 61:1 69:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 9:1 14:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 22:1 36:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 65:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 9:1 17:1 20:1 37:1 44:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 10:1 18:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 90:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 29:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 17:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 43:1 54:1 66:1 67:1 72:1 74:1 76:1 79:1 107:1 +0 5:1 11:1 15:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 16:1 25:1 38:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 16:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 81:1 120:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 25:1 38:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 7:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 54:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 31:1 35:1 45:1 56:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 78:1 110:1 +0 5:1 10:1 17:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 7:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 14:1 22:1 36:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 28:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 47:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 43:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 41:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 44:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 49:1 62:1 68:1 72:1 74:1 76:1 78:1 +0 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 14:1 21:1 35:1 41:1 48:1 64:1 71:1 72:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 42:1 47:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 21:1 35:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 11:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 56:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 18:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 11:1 15:1 28:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 9:1 18:1 22:1 36:1 40:1 55:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 26:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 40:1 53:1 65:1 70:1 72:1 74:1 76:1 78:1 119:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 8:1 15:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 +1 3:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 57:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 85:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 23:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 11:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 87:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 11:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 15:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 27:1 35:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 86:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 31:1 35:1 40:1 54:1 62:1 68:1 72:1 74:1 76:1 80:1 102:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 14:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 27:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 59:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 14:1 21:1 35:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 25:1 38:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 78:1 109:1 +0 1:1 11:1 15:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 33:1 35:1 40:1 53:1 63:1 68:1 73:1 75:1 76:1 80:1 98:1 +0 5:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 108:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 2:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 54:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 66:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 1:1 10:1 18:1 21:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 122:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 113:1 +0 3:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 25:1 38:1 41:1 48:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 10:1 14:1 25:1 38:1 42:1 59:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 28:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 11:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 24:1 38:1 42:1 59:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 10:1 14:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +1 3:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 11:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 17:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 43:1 47:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 9:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 44:1 52:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 2:1 10:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 17:1 25:1 38:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 78:1 101:1 +0 1:1 18:1 31:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 22:1 36:1 44:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 41:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 14:1 28:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 2:1 16:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 16:1 28:1 35:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 25:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 7:1 18:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 77:1 82:1 95:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 33:1 35:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 78:1 114:1 +1 4:1 11:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 20:1 37:1 41:1 52:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 9:1 14:1 29:1 39:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 31:1 35:1 45:1 49:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 119:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 81:1 119:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 119:1 +1 5:1 10:1 16:1 20:1 37:1 40:1 53:1 63:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 53:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 16:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 3:1 7:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 72:1 74:1 76:1 80:1 121:1 +1 2:1 11:1 17:1 20:1 37:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 70:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 77:1 80:1 111:1 +0 3:1 7:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 49:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 3:1 6:1 14:1 26:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 9:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 77:1 79:1 83:1 +0 2:1 7:1 14:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 118:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 16:1 22:1 36:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 15:1 29:1 39:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 70:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 15:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 17:1 30:1 35:1 40:1 63:1 67:1 73:1 75:1 76:1 78:1 103:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 10:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 40:1 53:1 65:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 24:1 38:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 43:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 20:1 37:1 41:1 54:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 68:1 72:1 74:1 77:1 79:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 14:1 24:1 38:1 40:1 52:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 33:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 5:1 11:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 10:1 16:1 24:1 38:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 69:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 41:1 59:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 9:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 8:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 31:1 35:1 45:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 14:1 20:1 37:1 41:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 15:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 44:1 51:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 87:1 +0 3:1 14:1 20:1 37:1 42:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 15:1 19:1 39:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 99:1 +0 4:1 6:1 14:1 31:1 35:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 8:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 24:1 38:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 80:1 +1 4:1 6:1 14:1 29:1 39:1 44:1 51:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 42:1 52:1 66:1 71:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 47:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 21:1 35:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 18:1 31:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 77:1 79:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 26:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +1 5:1 6:1 16:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 15:1 22:1 36:1 40:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 57:1 65:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 42:1 59:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +1 4:1 7:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 22:1 36:1 42:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 45:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 55:1 65:1 68:1 72:1 74:1 76:1 80:1 122:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 68:1 72:1 74:1 77:1 80:1 98:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 11:1 18:1 20:1 37:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 70:1 72:1 74:1 76:1 78:1 95:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 7:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 57:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 43:1 53:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 22:1 36:1 42:1 62:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 100:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 103:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 3:1 9:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 8:1 16:1 25:1 38:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 11:1 17:1 31:1 35:1 40:1 48:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 20:1 37:1 44:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 9:1 14:1 31:1 35:1 40:1 49:1 61:1 69:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 109:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 70:1 73:1 74:1 76:1 78:1 112:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 8:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 43:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 24:1 38:1 40:1 50:1 63:1 70:1 73:1 74:1 76:1 80:1 91:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 30:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 6:1 17:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 48:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 41:1 56:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 16:1 19:1 39:1 42:1 59:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 18:1 24:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 27:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 14:1 22:1 36:1 42:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +1 3:1 7:1 16:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 42:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 18:1 21:1 35:1 41:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 18:1 23:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 1:1 6:1 15:1 24:1 38:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 79:1 90:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 58:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 30:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 3:1 11:1 16:1 22:1 36:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 26:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 11:1 17:1 19:1 39:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 5:1 6:1 14:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 49:1 64:1 71:1 72:1 74:1 76:1 81:1 101:1 +1 4:1 11:1 14:1 19:1 39:1 40:1 52:1 63:1 69:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 88:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 31:1 35:1 45:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 29:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 78:1 90:1 +0 4:1 6:1 15:1 24:1 38:1 44:1 47:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 14:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 50:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 43:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 115:1 +0 5:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 41:1 47:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 23:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 53:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 28:1 35:1 43:1 54:1 65:1 67:1 72:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 80:1 88:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 28:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 10:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 9:1 15:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 5:1 11:1 17:1 19:1 39:1 41:1 55:1 64:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 17:1 26:1 35:1 40:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 65:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 17:1 24:1 38:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 47:1 66:1 71:1 72:1 75:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 11:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 25:1 38:1 40:1 49:1 65:1 67:1 72:1 74:1 76:1 82:1 103:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 27:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 7:1 18:1 20:1 37:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 54:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 22:1 36:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 21:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 98:1 +0 1:1 6:1 17:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 43:1 54:1 66:1 70:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 15:1 22:1 36:1 44:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +1 3:1 10:1 14:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 14:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 81:1 122:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 19:1 39:1 41:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 10:1 18:1 24:1 38:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 88:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 14:1 19:1 39:1 45:1 48:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 22:1 36:1 41:1 49:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 33:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 8:1 14:1 29:1 39:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 18:1 29:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 68:1 73:1 74:1 76:1 79:1 108:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 68:1 73:1 74:1 77:1 82:1 96:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 10:1 14:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 7:1 16:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 43:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 28:1 35:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 80:1 101:1 +0 3:1 11:1 14:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 43:1 52:1 65:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 1:1 6:1 16:1 31:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 3:1 6:1 17:1 19:1 39:1 43:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 47:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 29:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 29:1 39:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 86:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 68:1 73:1 74:1 76:1 80:1 94:1 +0 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 44:1 51:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 24:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 66:1 68:1 73:1 74:1 76:1 82:1 102:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 18:1 33:1 35:1 45:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +1 4:1 10:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 9:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 18:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 69:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 30:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 78:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 14:1 22:1 36:1 43:1 52:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 24:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 26:1 35:1 42:1 58:1 66:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 25:1 38:1 42:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 1:1 7:1 17:1 20:1 37:1 42:1 50:1 62:1 71:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 26:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 18:1 20:1 37:1 42:1 59:1 66:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 59:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 31:1 35:1 42:1 57:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 30:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 107:1 +0 5:1 6:1 15:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 11:1 14:1 22:1 36:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 11:1 14:1 29:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 95:1 +0 5:1 10:1 15:1 29:1 39:1 44:1 52:1 66:1 71:1 72:1 74:1 77:1 79:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 16:1 25:1 38:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 26:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 7:1 18:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 17:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 57:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 8:1 14:1 20:1 37:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 68:1 73:1 74:1 76:1 80:1 88:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 81:1 94:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 11:1 15:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 14:1 20:1 37:1 44:1 52:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 8:1 14:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 88:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 100:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 16:1 19:1 39:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 99:1 +0 2:1 6:1 14:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 65:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 15:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 16:1 25:1 38:1 41:1 47:1 64:1 71:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 31:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 14:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 16:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 45:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 43:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 21:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 94:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 45:1 57:1 66:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 28:1 35:1 40:1 61:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 15:1 22:1 36:1 41:1 57:1 66:1 67:1 72:1 75:1 76:1 82:1 88:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 17:1 24:1 38:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 31:1 35:1 43:1 54:1 62:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 44:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 48:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 7:1 17:1 19:1 39:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 41:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 106:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 82:1 98:1 +0 3:1 17:1 31:1 35:1 42:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 68:1 73:1 75:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 5:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 10:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 56:1 64:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 18:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 11:1 17:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 17:1 22:1 36:1 41:1 55:1 64:1 70:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 82:1 93:1 +0 4:1 6:1 18:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 45:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 112:1 +1 5:1 11:1 15:1 29:1 39:1 45:1 51:1 66:1 67:1 72:1 75:1 76:1 81:1 83:1 +0 2:1 17:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 21:1 35:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 27:1 35:1 41:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 26:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 11:1 16:1 20:1 37:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 77:1 81:1 83:1 +0 1:1 10:1 15:1 24:1 38:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 61:1 67:1 72:1 74:1 77:1 81:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 82:1 90:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 10:1 15:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 17:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 68:1 72:1 74:1 76:1 80:1 108:1 +1 3:1 9:1 18:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 43:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 82:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 73:1 74:1 76:1 81:1 85:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 45:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 19:1 39:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 29:1 39:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 1:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 77:1 82:1 90:1 +0 2:1 9:1 14:1 22:1 36:1 40:1 56:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 81:1 +0 4:1 17:1 20:1 37:1 44:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 15:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 53:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 15:1 20:1 37:1 40:1 57:1 65:1 70:1 73:1 74:1 76:1 82:1 109:1 +0 5:1 6:1 18:1 33:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 33:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 30:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 15:1 23:1 39:1 40:1 55:1 65:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 4:1 10:1 16:1 31:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 8:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 21:1 35:1 42:1 54:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 44:1 49:1 65:1 71:1 72:1 74:1 76:1 81:1 111:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 53:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 7:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 11:1 15:1 19:1 39:1 40:1 47:1 62:1 67:1 72:1 75:1 76:1 78:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 29:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 7:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 81:1 +0 3:1 7:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 10:1 14:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 15:1 24:1 38:1 41:1 55:1 64:1 71:1 72:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 18:1 20:1 37:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 43:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 15:1 23:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 16:1 22:1 36:1 43:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 66:1 68:1 73:1 74:1 76:1 79:1 110:1 +1 5:1 8:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 21:1 35:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 48:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 2:1 11:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 88:1 +1 5:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 3:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 55:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 3:1 10:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 78:1 114:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 27:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 119:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 80:1 +1 1:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 58:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 2:1 6:1 16:1 28:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 65:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 57:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 7:1 14:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 24:1 38:1 42:1 56:1 65:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 24:1 38:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 52:1 61:1 71:1 72:1 74:1 76:1 79:1 111:1 +0 3:1 6:1 14:1 19:1 39:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 17:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 3:1 9:1 15:1 20:1 37:1 41:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 31:1 35:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 41:1 52:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 17:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 25:1 38:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 9:1 18:1 25:1 38:1 42:1 47:1 62:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 43:1 55:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 14:1 19:1 39:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 33:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 94:1 +1 2:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 29:1 39:1 43:1 52:1 64:1 67:1 73:1 75:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 25:1 38:1 41:1 47:1 64:1 67:1 72:1 75:1 76:1 81:1 83:1 +1 4:1 9:1 17:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 30:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 118:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 65:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 41:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 10:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 41:1 53:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 17:1 22:1 36:1 45:1 66:1 71:1 72:1 74:1 76:1 81:1 111:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 17:1 21:1 35:1 41:1 51:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 51:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 17:1 31:1 35:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 9:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 33:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 16:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 15:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 1:1 6:1 14:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 45:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 32:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 42:1 55:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 43:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 14:1 22:1 36:1 42:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 18:1 21:1 35:1 44:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 42:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 18:1 23:1 39:1 44:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 11:1 18:1 24:1 38:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 15:1 23:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 96:1 +0 3:1 6:1 16:1 25:1 38:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 31:1 35:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 4:1 10:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 62:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 26:1 35:1 40:1 59:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 16:1 19:1 39:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 31:1 35:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 24:1 38:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 18:1 28:1 35:1 42:1 64:1 70:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 4:1 6:1 15:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 17:1 32:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 2:1 7:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 26:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 7:1 15:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 18:1 22:1 36:1 44:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 9:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 18:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 62:1 68:1 73:1 74:1 76:1 78:1 98:1 +0 5:1 14:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 52:1 65:1 67:1 73:1 74:1 76:1 80:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 8:1 16:1 22:1 36:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 27:1 35:1 42:1 49:1 66:1 70:1 72:1 74:1 76:1 78:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 2:1 7:1 15:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 18:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 1:1 6:1 16:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 10:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 15:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 11:1 18:1 27:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 31:1 35:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 11:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 41:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 17:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 16:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 25:1 38:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 27:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 17:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 11:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 3:1 9:1 14:1 25:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 56:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 68:1 73:1 75:1 76:1 79:1 98:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 8:1 15:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 16:1 22:1 36:1 41:1 55:1 62:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 31:1 35:1 43:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 44:1 57:1 66:1 67:1 72:1 74:1 76:1 78:1 89:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 8:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 77:1 82:1 83:1 +1 3:1 10:1 15:1 25:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 24:1 38:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 8:1 18:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 18:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 16:1 24:1 38:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 16:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 58:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 28:1 35:1 42:1 57:1 64:1 68:1 73:1 74:1 76:1 81:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 99:1 +1 2:1 6:1 18:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 17:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 15:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 16:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 8:1 15:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 27:1 35:1 42:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 17:1 20:1 37:1 40:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 10:1 16:1 25:1 38:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 21:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 7:1 14:1 23:1 39:1 41:1 49:1 64:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 16:1 22:1 36:1 43:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 14:1 24:1 38:1 40:1 50:1 63:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +1 3:1 10:1 16:1 23:1 39:1 40:1 52:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 23:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 23:1 39:1 41:1 51:1 64:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 18:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 20:1 37:1 42:1 62:1 68:1 72:1 74:1 76:1 78:1 93:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 11:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 53:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 42:1 55:1 64:1 68:1 72:1 74:1 76:1 79:1 91:1 +0 1:1 16:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 30:1 35:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 16:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 44:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 53:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 47:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1 +0 2:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 31:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 107:1 +1 5:1 14:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 75:1 76:1 82:1 106:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 50:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 24:1 38:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 43:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 42:1 47:1 66:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 5:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 18:1 22:1 36:1 40:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 18:1 22:1 36:1 41:1 66:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 22:1 36:1 44:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 8:1 17:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 71:1 73:1 75:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 +0 3:1 6:1 17:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 11:1 14:1 34:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 7:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 103:1 +0 4:1 7:1 17:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 85:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 24:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 53:1 62:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 42:1 56:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 14:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 18:1 19:1 39:1 45:1 57:1 66:1 67:1 73:1 74:1 76:1 78:1 112:1 +0 2:1 6:1 15:1 23:1 39:1 42:1 52:1 62:1 68:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 26:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 17:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 18:1 20:1 37:1 40:1 55:1 61:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 26:1 35:1 43:1 56:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +1 4:1 10:1 14:1 22:1 36:1 40:1 51:1 63:1 70:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 10:1 14:1 25:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 18:1 24:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 17:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 119:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 71:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 8:1 17:1 20:1 37:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 10:1 15:1 19:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 7:1 18:1 25:1 38:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 43:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 14:1 23:1 39:1 41:1 52:1 66:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 53:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 10:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 18:1 25:1 38:1 42:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 30:1 35:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 65:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 41:1 47:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 30:1 35:1 45:1 49:1 62:1 70:1 72:1 74:1 76:1 79:1 107:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 8:1 15:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 24:1 38:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 20:1 37:1 40:1 51:1 61:1 68:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 9:1 18:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 18:1 20:1 37:1 42:1 64:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 10:1 15:1 19:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 14:1 29:1 39:1 44:1 52:1 66:1 67:1 72:1 74:1 77:1 78:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 57:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 28:1 35:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +1 3:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 24:1 38:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 95:1 +0 5:1 14:1 20:1 37:1 44:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 29:1 39:1 44:1 52:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 14:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 43:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 48:1 64:1 69:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 26:1 35:1 42:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 15:1 20:1 37:1 42:1 54:1 64:1 68:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 17:1 27:1 35:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 107:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 9:1 15:1 20:1 37:1 42:1 55:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 25:1 38:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 7:1 18:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 18:1 20:1 37:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 21:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 7:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 7:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 44:1 56:1 65:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 103:1 +0 4:1 6:1 15:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 78:1 +0 2:1 6:1 15:1 26:1 35:1 40:1 56:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 24:1 38:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 121:1 +0 4:1 9:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 17:1 21:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 15:1 31:1 35:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +0 4:1 10:1 18:1 25:1 38:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 49:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 41:1 56:1 64:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 51:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 8:1 14:1 24:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 41:1 51:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 54:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 11:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 18:1 29:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 57:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 10:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 103:1 +0 4:1 7:1 15:1 19:1 39:1 41:1 51:1 64:1 70:1 73:1 74:1 76:1 78:1 96:1 +1 4:1 6:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 9:1 14:1 20:1 37:1 42:1 55:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 11:1 17:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 8:1 14:1 20:1 37:1 41:1 56:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 21:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 16:1 20:1 37:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 7:1 16:1 24:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 18:1 20:1 37:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 14:1 28:1 35:1 40:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 41:1 49:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 41:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 77:1 79:1 83:1 +0 5:1 14:1 30:1 35:1 45:1 66:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 9:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 16:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 4:1 6:1 17:1 24:1 38:1 40:1 57:1 63:1 70:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 28:1 35:1 41:1 56:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 15:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 42:1 49:1 66:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 75:1 76:1 82:1 83:1 +1 4:1 10:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 10:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 27:1 35:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 3:1 11:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 27:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 34:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 103:1 +0 1:1 6:1 14:1 21:1 35:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 15:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 8:1 16:1 19:1 39:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 10:1 18:1 22:1 36:1 43:1 57:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 42:1 47:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 9:1 18:1 19:1 39:1 41:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 30:1 35:1 40:1 49:1 61:1 68:1 72:1 74:1 76:1 80:1 102:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 17:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 55:1 65:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 53:1 65:1 71:1 73:1 75:1 76:1 80:1 83:1 +1 2:1 6:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 66:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 28:1 35:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 44:1 59:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 18:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 18:1 20:1 37:1 42:1 62:1 68:1 73:1 74:1 76:1 80:1 98:1 +1 2:1 6:1 16:1 25:1 38:1 40:1 52:1 62:1 67:1 72:1 75:1 76:1 78:1 83:1 +0 4:1 6:1 14:1 19:1 39:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 15:1 19:1 39:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 18:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 16:1 27:1 35:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 25:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 88:1 +0 2:1 15:1 29:1 39:1 42:1 64:1 70:1 72:1 74:1 76:1 80:1 91:1 +1 5:1 9:1 18:1 20:1 37:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 17:1 25:1 38:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 15:1 26:1 35:1 42:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 10:1 14:1 19:1 39:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 41:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 26:1 35:1 44:1 57:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 7:1 17:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 22:1 36:1 42:1 65:1 68:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 7:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 6:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 82:1 +0 3:1 6:1 18:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 18:1 25:1 38:1 40:1 63:1 67:1 73:1 74:1 76:1 80:1 87:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 43:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 43:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 88:1 +1 5:1 10:1 15:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 18:1 27:1 35:1 43:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 51:1 63:1 71:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 14:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 15:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 20:1 37:1 42:1 49:1 65:1 68:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 24:1 38:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 8:1 17:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 87:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 15:1 22:1 36:1 40:1 52:1 61:1 68:1 72:1 74:1 76:1 78:1 94:1 +0 5:1 6:1 15:1 31:1 35:1 40:1 55:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 9:1 18:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 48:1 66:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 9:1 18:1 20:1 37:1 42:1 55:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 11:1 15:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 21:1 35:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 25:1 38:1 40:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 65:1 68:1 73:1 74:1 76:1 80:1 84:1 +1 3:1 7:1 15:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 9:1 15:1 22:1 36:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 44:1 49:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 41:1 51:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 16:1 29:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 8:1 15:1 21:1 35:1 42:1 51:1 65:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 7:1 17:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 48:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 42:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 88:1 +0 2:1 10:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 20:1 37:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 17:1 24:1 38:1 42:1 50:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 50:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 14:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 21:1 35:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 33:1 35:1 44:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 99:1 +0 3:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 19:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 11:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 16:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 29:1 39:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 22:1 36:1 42:1 49:1 65:1 68:1 73:1 75:1 76:1 82:1 +0 4:1 6:1 15:1 31:1 35:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 24:1 38:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 8:1 15:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 15:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 43:1 52:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 10:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 29:1 39:1 42:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 10:1 16:1 19:1 39:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 4:1 8:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 15:1 22:1 36:1 41:1 54:1 66:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 5:1 7:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 18:1 22:1 36:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 15:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 1:1 17:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 17:1 19:1 39:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 14:1 20:1 37:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 31:1 35:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 18:1 22:1 36:1 42:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 8:1 14:1 22:1 36:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 11:1 14:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 16:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 78:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 48:1 63:1 68:1 73:1 74:1 76:1 80:1 98:1 +0 1:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 15:1 22:1 36:1 40:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 24:1 38:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 9:1 17:1 32:1 39:1 40:1 52:1 63:1 68:1 73:1 75:1 76:1 80:1 102:1 +0 1:1 10:1 16:1 19:1 39:1 42:1 52:1 62:1 68:1 72:1 74:1 76:1 79:1 94:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 14:1 33:1 35:1 44:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 18:1 20:1 37:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 42:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 28:1 35:1 42:1 50:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 41:1 53:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 +1 1:1 10:1 16:1 33:1 35:1 42:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 114:1 +0 5:1 6:1 16:1 20:1 37:1 41:1 47:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 21:1 35:1 42:1 50:1 62:1 71:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 7:1 16:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +1 5:1 6:1 16:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 34:1 35:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 47:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 25:1 38:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 51:1 66:1 71:1 72:1 74:1 76:1 80:1 101:1 +1 4:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 14:1 22:1 36:1 40:1 51:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 42:1 55:1 64:1 70:1 73:1 74:1 76:1 80:1 +0 4:1 10:1 17:1 20:1 37:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 24:1 38:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 2:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 88:1 +0 3:1 6:1 14:1 25:1 38:1 42:1 47:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 23:1 39:1 40:1 51:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 22:1 36:1 43:1 55:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 25:1 38:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 11:1 17:1 19:1 39:1 41:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 43:1 48:1 64:1 69:1 73:1 74:1 76:1 79:1 122:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 54:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 7:1 14:1 22:1 36:1 41:1 56:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 2:1 6:1 16:1 24:1 38:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 2:1 7:1 15:1 20:1 37:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 9:1 14:1 19:1 39:1 44:1 51:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 49:1 63:1 69:1 73:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 7:1 14:1 19:1 39:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 4:1 7:1 14:1 19:1 39:1 42:1 56:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +1 2:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 68:1 73:1 74:1 77:1 82:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 32:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 8:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 31:1 35:1 44:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 9:1 17:1 20:1 37:1 40:1 55:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 12:1 16:1 20:1 37:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 65:1 70:1 73:1 74:1 76:1 80:1 115:1 +0 2:1 6:1 18:1 21:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 3:1 10:1 16:1 19:1 39:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 10:1 18:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +1 2:1 6:1 16:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 25:1 38:1 45:1 50:1 66:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 78:1 83:1 +1 4:1 10:1 17:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 17:1 24:1 38:1 42:1 52:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 14:1 20:1 37:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 10:1 16:1 20:1 37:1 42:1 59:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 28:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 99:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 24:1 38:1 42:1 51:1 64:1 68:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 14:1 32:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 26:1 35:1 42:1 54:1 62:1 71:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 14:1 25:1 38:1 42:1 57:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 5:1 15:1 20:1 37:1 42:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 47:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 6:1 14:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 14:1 20:1 37:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 16:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 112:1 +0 5:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 10:1 14:1 27:1 35:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +1 4:1 10:1 16:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 41:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 13:1 16:1 22:1 36:1 40:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 30:1 35:1 40:1 53:1 65:1 67:1 73:1 74:1 76:1 80:1 103:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 77:1 82:1 +1 3:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 17:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 16:1 29:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 77:1 80:1 83:1 +0 3:1 6:1 18:1 28:1 35:1 45:1 53:1 66:1 67:1 73:1 74:1 76:1 79:1 103:1 +0 4:1 6:1 15:1 20:1 37:1 41:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 99:1 +0 1:1 13:1 15:1 20:1 37:1 42:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 9:1 16:1 22:1 36:1 42:1 60:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 20:1 37:1 41:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 44:1 50:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +0 5:1 11:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 10:1 16:1 20:1 37:1 42:1 59:1 65:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 11:1 15:1 20:1 37:1 41:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 11:1 15:1 20:1 37:1 42:1 49:1 62:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 4:1 6:1 15:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 80:1 122:1 +0 2:1 6:1 17:1 31:1 35:1 41:1 48:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 2:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 15:1 28:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 103:1 +1 3:1 8:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 16:1 33:1 35:1 45:1 56:1 64:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 1:1 15:1 21:1 35:1 42:1 62:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 64:1 68:1 73:1 74:1 76:1 82:1 105:1 +0 3:1 10:1 18:1 22:1 36:1 41:1 57:1 64:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 7:1 16:1 29:1 39:1 44:1 50:1 64:1 67:1 73:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 17:1 19:1 39:1 44:1 48:1 64:1 67:1 73:1 75:1 76:1 78:1 88:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 54:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 14:1 22:1 36:1 44:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 15:1 19:1 39:1 45:1 55:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 11:1 17:1 19:1 39:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 21:1 35:1 42:1 48:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 14:1 27:1 35:1 45:1 54:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 3:1 6:1 16:1 31:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 25:1 38:1 41:1 55:1 64:1 67:1 72:1 75:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 25:1 38:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 15:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 15:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 6:1 15:1 34:1 35:1 40:1 54:1 65:1 71:1 73:1 74:1 76:1 82:1 107:1 +0 5:1 11:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 16:1 29:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 4:1 6:1 15:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 10:1 17:1 27:1 35:1 40:1 59:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 15:1 23:1 39:1 42:1 52:1 64:1 68:1 73:1 75:1 76:1 80:1 98:1 +1 4:1 7:1 15:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 116:1 +1 5:1 6:1 14:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 25:1 38:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 18:1 22:1 36:1 40:1 53:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 48:1 64:1 68:1 72:1 74:1 76:1 80:1 91:1 +0 2:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 43:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 119:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 26:1 35:1 40:1 49:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 4:1 10:1 15:1 22:1 36:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 9:1 18:1 19:1 39:1 42:1 52:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 9:1 14:1 22:1 36:1 40:1 50:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 20:1 37:1 42:1 55:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 24:1 38:1 43:1 47:1 66:1 67:1 72:1 75:1 76:1 78:1 83:1 +1 4:1 6:1 17:1 20:1 37:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 17:1 22:1 36:1 43:1 59:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 17:1 28:1 35:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 19:1 39:1 42:1 55:1 64:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 2:1 7:1 15:1 22:1 36:1 41:1 49:1 64:1 67:1 73:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 41:1 47:1 64:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 43:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 49:1 65:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 16:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 5:1 10:1 16:1 20:1 37:1 40:1 59:1 63:1 67:1 73:1 74:1 77:1 80:1 83:1 +0 5:1 10:1 15:1 27:1 35:1 42:1 49:1 65:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 30:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 104:1 +0 3:1 6:1 18:1 22:1 36:1 41:1 49:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 21:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 17:1 20:1 37:1 42:1 50:1 62:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 17:1 19:1 39:1 42:1 50:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 15:1 20:1 37:1 41:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 33:1 35:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 5:1 7:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 4:1 6:1 16:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 14:1 21:1 35:1 44:1 53:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 1:1 6:1 16:1 30:1 35:1 40:1 54:1 61:1 69:1 72:1 74:1 76:1 79:1 103:1 +0 1:1 17:1 22:1 36:1 42:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 17:1 22:1 36:1 41:1 49:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 9:1 15:1 19:1 39:1 40:1 55:1 61:1 68:1 72:1 74:1 76:1 80:1 98:1 +1 5:1 10:1 17:1 32:1 39:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +0 5:1 7:1 14:1 27:1 35:1 40:1 56:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 27:1 35:1 41:1 54:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 34:1 35:1 41:1 49:1 64:1 70:1 73:1 74:1 76:1 82:1 103:1 +0 4:1 7:1 16:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 17:1 22:1 36:1 42:1 53:1 66:1 67:1 72:1 75:1 76:1 79:1 83:1 +0 1:1 6:1 16:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 7:1 14:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 16:1 19:1 39:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 2:1 7:1 16:1 20:1 37:1 45:1 48:1 62:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 20:1 37:1 40:1 57:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 49:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 50:1 62:1 67:1 72:1 74:1 77:1 78:1 83:1 +0 5:1 6:1 14:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 48:1 64:1 71:1 72:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 16:1 22:1 36:1 44:1 54:1 66:1 71:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 15:1 31:1 35:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 14:1 29:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 +0 3:1 6:1 17:1 26:1 35:1 40:1 57:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 16:1 20:1 37:1 43:1 51:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 17:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 4:1 6:1 14:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 20:1 37:1 41:1 55:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +1 3:1 7:1 15:1 19:1 39:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 7:1 18:1 21:1 35:1 45:1 48:1 64:1 67:1 73:1 74:1 76:1 78:1 97:1 +1 3:1 6:1 15:1 29:1 39:1 40:1 47:1 63:1 68:1 73:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 77:1 81:1 83:1 +0 5:1 6:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 100:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 1:1 6:1 18:1 19:1 39:1 42:1 54:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 4:1 8:1 16:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 5:1 10:1 17:1 22:1 36:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 8:1 16:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 44:1 51:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 6:1 15:1 23:1 39:1 40:1 52:1 63:1 67:1 73:1 75:1 76:1 81:1 83:1 +0 5:1 6:1 17:1 26:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 7:1 16:1 22:1 36:1 42:1 51:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 8:1 16:1 32:1 39:1 42:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 +0 5:1 6:1 18:1 32:1 39:1 41:1 52:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 41:1 53:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 14:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 9:1 16:1 29:1 39:1 41:1 52:1 66:1 67:1 72:1 75:1 76:1 80:1 83:1 +1 3:1 6:1 16:1 24:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 14:1 22:1 36:1 42:1 53:1 66:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 3:1 6:1 14:1 28:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 15:1 28:1 35:1 41:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 16:1 24:1 38:1 42:1 49:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 11:1 17:1 27:1 35:1 40:1 49:1 61:1 71:1 72:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 17:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 25:1 38:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 20:1 37:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 4:1 6:1 18:1 20:1 37:1 41:1 51:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 40:1 49:1 62:1 68:1 72:1 74:1 76:1 79:1 83:1 +0 5:1 6:1 16:1 20:1 37:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 51:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 18:1 22:1 36:1 40:1 50:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 15:1 26:1 35:1 41:1 64:1 71:1 73:1 74:1 76:1 79:1 83:1 +0 3:1 6:1 14:1 22:1 36:1 41:1 55:1 66:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 17:1 22:1 36:1 41:1 50:1 62:1 67:1 73:1 74:1 76:1 82:1 +0 1:1 6:1 18:1 21:1 35:1 41:1 54:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 5:1 18:1 22:1 36:1 42:1 64:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 2:1 6:1 16:1 20:1 37:1 42:1 48:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 1:1 6:1 18:1 21:1 35:1 42:1 52:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 42:1 49:1 64:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 48:1 65:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 6:1 14:1 21:1 35:1 41:1 57:1 66:1 67:1 73:1 74:1 77:1 82:1 83:1 +0 5:1 6:1 15:1 26:1 35:1 40:1 49:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 3:1 10:1 14:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 6:1 17:1 29:1 39:1 41:1 50:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 16:1 31:1 35:1 42:1 55:1 64:1 71:1 73:1 74:1 76:1 80:1 83:1 +1 3:1 6:1 14:1 25:1 38:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 5:1 6:1 18:1 19:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 15:1 31:1 35:1 41:1 49:1 64:1 71:1 72:1 74:1 76:1 79:1 107:1 +0 2:1 6:1 16:1 22:1 36:1 43:1 50:1 64:1 67:1 72:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 81:1 +0 1:1 10:1 18:1 19:1 39:1 42:1 55:1 62:1 71:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 22:1 36:1 42:1 54:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 4:1 6:1 14:1 29:1 39:1 40:1 52:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 25:1 38:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 81:1 83:1 +0 5:1 9:1 14:1 31:1 35:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +0 2:1 6:1 16:1 25:1 38:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 15:1 27:1 35:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +1 5:1 10:1 15:1 22:1 36:1 40:1 48:1 63:1 67:1 73:1 75:1 76:1 80:1 83:1 +1 4:1 6:1 18:1 20:1 37:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 22:1 36:1 42:1 49:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 3:1 6:1 18:1 22:1 36:1 40:1 48:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 21:1 35:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 14:1 22:1 36:1 41:1 57:1 64:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 16:1 24:1 38:1 42:1 54:1 65:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 25:1 38:1 41:1 66:1 67:1 72:1 74:1 76:1 78:1 +0 2:1 6:1 17:1 31:1 35:1 40:1 57:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 20:1 37:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 40:1 54:1 61:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 15:1 22:1 36:1 43:1 50:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 18:1 19:1 39:1 40:1 61:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 14:1 19:1 39:1 42:1 64:1 68:1 72:1 74:1 76:1 82:1 83:1 +1 3:1 6:1 17:1 32:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +1 5:1 6:1 18:1 19:1 39:1 40:1 51:1 63:1 68:1 73:1 74:1 76:1 82:1 91:1 +0 3:1 6:1 16:1 20:1 37:1 41:1 55:1 66:1 67:1 72:1 74:1 76:1 79:1 83:1 +0 1:1 6:1 18:1 28:1 35:1 42:1 59:1 62:1 71:1 73:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 16:1 19:1 39:1 42:1 51:1 64:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 18:1 22:1 36:1 42:1 48:1 64:1 71:1 73:1 74:1 76:1 81:1 83:1 +1 3:1 6:1 15:1 19:1 39:1 41:1 52:1 66:1 71:1 72:1 75:1 76:1 81:1 83:1 +1 5:1 18:1 32:1 39:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 11:1 17:1 22:1 36:1 43:1 55:1 62:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 17:1 22:1 36:1 43:1 64:1 71:1 72:1 74:1 76:1 78:1 83:1 +0 5:1 15:1 22:1 36:1 40:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1 +0 4:1 10:1 15:1 24:1 38:1 41:1 52:1 66:1 67:1 72:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 17:1 29:1 39:1 41:1 49:1 64:1 70:1 72:1 74:1 76:1 78:1 83:1 +1 3:1 10:1 15:1 24:1 38:1 40:1 55:1 61:1 67:1 72:1 74:1 76:1 78:1 83:1 +0 3:1 6:1 17:1 24:1 38:1 41:1 47:1 64:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 18:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 103:1 +0 5:1 7:1 14:1 23:1 39:1 42:1 52:1 64:1 67:1 73:1 75:1 76:1 82:1 83:1 +0 4:1 11:1 17:1 20:1 37:1 41:1 55:1 65:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 4:1 7:1 14:1 20:1 37:1 40:1 48:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 +0 2:1 6:1 14:1 31:1 35:1 40:1 53:1 63:1 69:1 73:1 74:1 76:1 80:1 83:1 +0 4:1 6:1 14:1 25:1 38:1 40:1 50:1 63:1 67:1 73:1 74:1 76:1 81:1 83:1 +0 2:1 6:1 15:1 29:1 39:1 42:1 47:1 64:1 68:1 73:1 74:1 76:1 78:1 110:1 +1 5:1 6:1 18:1 29:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 18:1 20:1 37:1 42:1 59:1 64:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 2:1 6:1 17:1 24:1 38:1 40:1 47:1 61:1 67:1 72:1 74:1 76:1 79:1 83:1 +1 3:1 6:1 15:1 22:1 36:1 40:1 54:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 +0 5:1 6:1 15:1 22:1 36:1 44:1 55:1 66:1 67:1 72:1 74:1 76:1 80:1 83:1 +0 1:1 6:1 17:1 22:1 36:1 42:1 55:1 62:1 67:1 73:1 74:1 76:1 78:1 83:1 +1 5:1 8:1 18:1 22:1 36:1 40:1 51:1 61:1 67:1 72:1 75:1 76:1 80:1 83:1 diff --git a/spark-on-angel/automl/pom.xml b/spark-on-angel/automl/pom.xml index d97c8b739..539dc485c 100644 --- a/spark-on-angel/automl/pom.xml +++ b/spark-on-angel/automl/pom.xml @@ -15,10 +15,26 @@ 2.2.0 + 2.7.3 ${project.parent.parent.basedir} + + org.apache.hadoop + hadoop-common + ${hadoop.version} + + + org.apache.hadoop + hadoop-client + ${hadoop.version} + + + org.apache.hadoop + hadoop-hdfs + ${hadoop.version} + org.apache.spark spark-core_${scala.binary.version} @@ -29,6 +45,11 @@ spark-mllib_${scala.binary.version} ${spark.version} + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala new file mode 100644 index 000000000..b55fb1a64 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala @@ -0,0 +1,49 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature + +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector} +import org.apache.spark.sql.{Dataset, Row} + +object FeatureUtils { + + def maxDim(dataset: Dataset[Row], col: String = "features"): Int = { + dataset.select(col).rdd.mapPartitions{ rows: Iterator[Row] => + val dim = rows.map{ case Row(v: Vector) => + v match { + case sv: SparseVector => sv.indices.last + case dv: DenseVector => dv.size + } + }.max + Iterator(dim) + }.max + 1 + } + + def countNonZero(dataset: Dataset[Row], col: String = "features"): Array[Int] = { + dataset.select(col).rdd.mapPartitions { rows: Iterator[Row] => + val mergeIndices = rows.map{ case Row(v: Vector) => + v match { + case sv: SparseVector => + sv.indices.toList + } + }.reduce(_ union _ distinct) + Iterator(mergeIndices) + }.reduce((a, b) => (a union b).distinct).toArray + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossMeta.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossMeta.scala new file mode 100644 index 000000000..0d388b958 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossMeta.scala @@ -0,0 +1,34 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.cross + +class FeatureCrossMeta(var curIdx: Int, val crossInfo: String) { + +} + +object FeatureCrossMeta { + + def apply(curIdx: Int, crossInfo: String): FeatureCrossMeta = { + new FeatureCrossMeta(curIdx, crossInfo) + } + + def cross(idx: Int, from: FeatureCrossMeta, to: FeatureCrossMeta): FeatureCrossMeta = { + FeatureCrossMeta(idx, from.crossInfo + "*" + to.crossInfo) + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossOp.scala new file mode 100644 index 000000000..7314f4bd8 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCrossOp.scala @@ -0,0 +1,59 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.cross + +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector} + +import scala.collection.mutable.ArrayBuffer + +object FeatureCrossOp { + + def flatCartesian(vector: Vector): Vector = { + val curDim = vector.size + vector match { + case sv: SparseVector => + val indices = new ArrayBuffer[Int]() + val values = new ArrayBuffer[Double]() + sv.indices.foreach { idx1 => + sv.indices.foreach { idx2 => + indices += curDim * idx1 + idx2 + values += sv(idx1) * sv(idx2) + } + } + val sorted = indices.zip(values).sortBy(_._1) + val sortedIndices = sorted.map(_._1) + val sortedValues = sorted.map(_._2) + new SparseVector(sv.size * sv.size, sortedIndices.toArray, sortedValues.toArray) + case dv: DenseVector => + val values: Array[Double] = new Array(dv.size * dv.size) + (0 until dv.size).foreach { idx1 => + (0 until dv.size).foreach { idx2 => + values(dv.size * idx1 + idx2) = dv(idx1) * dv(idx2) + } + } + new DenseVector(values) + } + } + + def main(args: Array[String]): Unit = { + val v = new DenseVector(Array(1, 2, 3)) + val cv = flatCartesian(v) + println(cv.toDense.values.mkString(",")) + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala new file mode 100644 index 000000000..bf6b2c0c0 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala @@ -0,0 +1,67 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import com.tencent.angel.spark.automl.feature.FeatureUtils +import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.feature.operator.{Cartesian, VectorFilterZero} +import org.apache.spark.sql.SparkSession + +object FilterNonZero { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + + val trainDF = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val maxDim = FeatureUtils.maxDim(trainDF) + println(s"max dimension: $maxDim") + + // feature cross meta + var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() + (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) + + val featureMap: Map[Int, Int] = Map[Int, Int]() + + val cartesian = new Cartesian() + .setInputCol("features") + .setOutputCol("cartesian_features") + + val filter = new VectorFilterZero(featureMap) + .setInputCol("cartesian_features") + .setOutputCol("filter_features") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, filter)) + + val pipelineModel = pipeline.fit(trainDF) + + val filterDF = pipelineModel.transform(trainDF) + + println("nonzero features:") + println(filter.featureMap.mkString(",")) + + filterDF.show(1) + + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala new file mode 100644 index 000000000..0cfdd13d3 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala @@ -0,0 +1,60 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import org.apache.spark.ml.classification.LogisticRegression +import org.apache.spark.ml.feature.operator.Cartesian +import org.apache.spark.sql.SparkSession + +object LassoSelector { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val splitData = data.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitData(0) + val testDF = splitData(1) + + val cartesianOp = new Cartesian() + .setInputCol("features") + .setOutputCol("cartesian_features") + + val crossDF = cartesianOp.transform(trainDF) + + val lr = new LogisticRegression() + .setFeaturesCol("cartesian_features") + .setLabelCol("label") + .setElasticNetParam(1.0) + .setMaxIter(10) + + val lrModel = lr.fit(crossDF) + lrModel.evaluate(testDF) + + println(s"nonzero items in weight vector:") + println(lrModel.coefficients.toDense.values.zipWithIndex + .filter{ case (v: Double, i: Int) => math.abs(v) > 1e-10 }.take(100).mkString(",")) + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala new file mode 100644 index 000000000..a7ea9a1d5 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala @@ -0,0 +1,118 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import com.tencent.angel.spark.automl.feature.FeatureUtils +import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.operator.Cartesian +import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} +import org.apache.spark.sql.SparkSession + +object OneOrderCross { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val maxDim = FeatureUtils.maxDim(data) + println(s"max dimension: $maxDim") + + // feature cross meta + var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() + (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) + + val cartesianOp = new Cartesian() + .setInputCol("features") + .setOutputCol("cartesian_features") + + //val crossDF = cartesianOp.transform(trainDF).persist() + + val selector = new ChiSqSelector() + .setNumTopFeatures(maxDim * maxDim / 2) + .setFeaturesCol("cartesian_features") + .setLabelCol("label") + .setOutputCol("selected_features") + + val allAssembler = new VectorAssembler() + .setInputCols(Array("features", "cartesian_features")) + .setOutputCol("assemble_features") + + val selectedAssembler = new VectorAssembler() + .setInputCols(Array("features", "selected_features")) + .setOutputCol("assemble_features_selected") + + val pipeline = new Pipeline() + .setStages(Array(cartesianOp, selector, allAssembler, selectedAssembler)) + + val featureModel = pipeline.fit(data) + val crossDF = featureModel.transform(data) + + println(crossDF.schema) + crossDF.show(1) + + val splitData = crossDF.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitData(0).persist() + val testDF = splitData(1).persist() + + // original features + val lr_orig = new LogisticRegression() + .setFeaturesCol("features") + .setMaxIter(10) + .setRegParam(0.01) + val auc_orig = lr_orig.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $auc_orig") + + // original features + val lr_cross = new LogisticRegression() + .setFeaturesCol("cartesian_features") + .setMaxIter(10) + .setRegParam(0.01) + val auc_cross = lr_cross.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"cross feature: auc = $auc_cross") + + // original features + all cross features + val lr_orig_cross = new LogisticRegression() + .setFeaturesCol("assemble_features") + .setLabelCol("label") + .setMaxIter(10) + .setRegParam(0.01) + val auc_orig_cross = lr_orig_cross.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature + cross feature: auc = $auc_orig_cross") + + // original features + selected cross features + val lr_orig_cross_select = new LogisticRegression() + .setFeaturesCol("assemble_features_selected") + .setLabelCol("label") + .setMaxIter(10) + .setRegParam(0.01) + val auc_orig_cross_select = lr_orig_cross_select.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature + selected cross feature: auc = $auc_orig_cross_select") + + + spark.close() + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala new file mode 100644 index 000000000..623acc39c --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -0,0 +1,119 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import com.tencent.angel.spark.automl.feature.FeatureUtils +import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} +import org.apache.spark.ml.feature.operator.Cartesian +import org.apache.spark.sql.SparkSession + +object TwoOrderCross { + + def main(args: Array[String]): Unit = { + + val spark = SparkSession.builder().master("local").getOrCreate() + + val trainDF = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + + trainDF.persist() + + val maxDim = FeatureUtils.maxDim(trainDF) + println(s"max dimension: $maxDim") + + // feature cross meta + var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() + (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) + + val cartesian_1 = new Cartesian() + .setInputCol("features") + .setOutputCol("cartesian_features_1") + + val selector_1 = new ChiSqSelector() + .setNumTopFeatures(maxDim * maxDim / 10) + .setFeaturesCol("cartesian_features_1") + .setLabelCol("label") + .setOutputCol("selected_features_1") + + val assembler1 = new VectorAssembler() + .setInputCols(Array("features", "selected_features_1")) + .setOutputCol("assemble_features_1") + + val cartesian_2 = new Cartesian() + .setInputCol("assemble_features_1") + .setOutputCol("cartesian_features_2") + + val selector_2 = new ChiSqSelector() + .setNumTopFeatures(10 * maxDim) + .setFeaturesCol("cartesian_features_2") + .setLabelCol("label") + .setOutputCol("selected_features_2") + + val assembler_2 = new VectorAssembler() + .setInputCols(Array("assemble_features_1", "selected_features_2")) + .setOutputCol("assemble_features_2") + + val pipeline = new Pipeline() + .setStages(Array(cartesian_1, selector_1, assembler1)) + //.setStages(Array(cartesian_1, selector_1, assembler1, cartesian_2, selector_2, assembler_2)) + + val featureModel = pipeline.fit(trainDF) + val crossDF = featureModel.transform(trainDF) + + crossDF.persist() + trainDF.unpersist() + + println(crossDF.schema) + crossDF.show(1) + + println("non zero features in cartesian features") + println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) + + // original features + val lr_orig = new LogisticRegression() + .setFeaturesCol("features") + .setMaxIter(10) + .setRegParam(0.01) + val auc_orig = lr_orig.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $auc_orig") + + // one-order cross + val lr_cross_1 = new LogisticRegression() + .setFeaturesCol("cartesian_features_1") + .setMaxIter(10) + .setRegParam(0.01) + val auc_cross_1 = lr_cross_1.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"one order cross feature: auc = $auc_cross_1") + + // original features + all cross features +// val lr_cross_2 = new LogisticRegression() +// .setFeaturesCol("assemble_features_2") +// .setLabelCol("label") +// .setMaxIter(10) +// .setRegParam(0.01) +// val auc_cross_2 = lr_cross_2.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC +// println(s"original feature + cross feature: auc = $auc_cross_2") + + spark.close() + } + +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala new file mode 100644 index 000000000..9d917c501 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package org.apache.spark.ml.feature.operator + +import com.tencent.angel.spark.automl.feature.cross.FeatureCrossOp +import org.apache.spark.annotation.Since +import org.apache.spark.ml.linalg.{Vector, VectorUDT} +import org.apache.spark.ml.UnaryTransformer +import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} +import org.apache.spark.sql.types.DataType + +class Cartesian(override val uid: String) + extends UnaryTransformer[Vector, Vector, Cartesian] with DefaultParamsWritable { + + @Since("1.4.0") + def this() = this(Identifiable.randomUID("cartesian_product")) + + override protected def createTransformFunc: Vector => Vector = FeatureCrossOp.flatCartesian + + override protected def outputDataType: DataType = new VectorUDT() +} + +object Normalizer extends DefaultParamsReadable[Cartesian] { + + @Since("1.6.0") + override def load(path: String): Cartesian = super.load(path) +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala new file mode 100644 index 000000000..4b8fe6d0a --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala @@ -0,0 +1,158 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package org.apache.spark.ml.feature.operator + +import org.apache.spark.SparkException +import org.apache.spark.annotation.Since +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute, UnresolvedAttribute} +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.linalg.{SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.param.shared.{HasInputCol, HasOutputCol} +import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} +import org.apache.spark.sql.{DataFrame, Dataset, Row} +import org.apache.spark.sql.functions.{col, struct, udf} +import org.apache.spark.sql.types._ + +import scala.collection.mutable.{ArrayBuffer, ArrayBuilder} + +class VectorFilterZero(var featureMap: Map[Int, Int], override val uid: String) + extends Transformer with HasInputCol with HasOutputCol with DefaultParamsWritable { + + def this(featureMap: Map[Int, Int]) = this(featureMap, Identifiable.randomUID("drop_nonzero_feature")) + + /** @group setParam */ + def setInputCol(value: String): this.type = set(inputCol, value) + + /** @group setParam */ + def setOutputCol(value: String): this.type = set(outputCol, value) + + override def transform(dataset: Dataset[_]): DataFrame = { + transformSchema(dataset.schema, logging = true) + // Schema transformation. + val schema = dataset.schema + val attrs = VectorFilterZero.getAttrs(dataset, ${inputCol}) + val metadata = new AttributeGroup($(outputCol), attrs).toMetadata() + + val nnzIndices = VectorFilterZero.getNonZero(dataset, $(inputCol)) + + featureMap ++= nnzIndices.zipWithIndex.toMap + println(s"feature map:") + println(featureMap.mkString(",")) + + // Data transformation. + val filterFunc = udf { r: Row => + val vec = r.get(0).asInstanceOf[Vector] + VectorFilterZero.filter(featureMap, vec) + } + val args = Array($(inputCol)).map { c => + schema(c).dataType match { + case _: VectorUDT => dataset(c) + } + } + + dataset.select(col("*"), filterFunc(struct(args: _*)).as($(outputCol), metadata)) + } + + override def transformSchema(schema: StructType): StructType = { + val inputColName = $(inputCol) + val outputColName = $(outputCol) + val inputDataType = schema(inputColName).dataType + if (!inputDataType.isInstanceOf[VectorUDT]) { + throw new IllegalArgumentException(s"Data type $inputDataType is not supported.") + } + if (schema.fieldNames.contains(outputColName)) { + throw new IllegalArgumentException(s"Output column $outputColName already exists.") + } + StructType(schema.fields :+ new StructField(outputColName, new VectorUDT, true)) + } + + override def copy(extra: ParamMap): VectorAssembler = defaultCopy(extra) +} + +object VectorFilterZero extends DefaultParamsReadable[VectorFilterZero]{ + + override def load(path: String): VectorFilterZero = super.load(path) + + private def getAttrs(dataset: Dataset[_], inputCol: String): Array[Attribute] = { + val schema = dataset.schema + lazy val first = dataset.toDF.first() + val field = schema(inputCol) + val index = schema.fieldIndex(inputCol) + field.dataType match { + case _: VectorUDT => + val group = AttributeGroup.fromStructField(field) + if (group.attributes.isDefined) { + // If attributes are defined, copy them with updated names. + group.attributes.get.zipWithIndex.map { case (attr, i) => + if (attr.name.isDefined) { + // TODO: Define a rigorous naming scheme. + attr.withName(inputCol + "_" + attr.name.get) + } else { + attr.withName(inputCol + "_" + i) + } + } + } else { + // Otherwise, treat all attributes as numeric. If we cannot get the number of attributes + // from metadata, check the first row. + val numAttrs = group.numAttributes.getOrElse(first.getAs[Vector](index).size) + Array.tabulate(numAttrs)(i => NumericAttribute.defaultAttr.withName(inputCol + "_" + i)) + } + case otherType => + throw new SparkException(s"VectorFilterZero does not support the $otherType type") + } + } + + private def getNonZero(dataset: Dataset[_], + column: String): Array[Int] = { + dataset.select(column).rdd.mapPartitions { rows: Iterator[Row] => + val mergeIndices = rows.map{ case Row(v: Vector) => + v match { + case sv: SparseVector => + sv.indices + case _ => throw new IllegalArgumentException(s"Input column $column should be SparseVector.") + + } + }.reduce(_ union _ distinct) + Iterator(mergeIndices) + }.collect().reduce((a, b) => (a union b).distinct).sortBy(x => x) + } + + private def filter(featureMap: Map[Int, Int], vec: Vector): Vector = { + val indices = ArrayBuilder.make[Int] + val values = ArrayBuilder.make[Double] + vec match { + case vec: Vector => + vec.foreachActive { case (i, v) => + if (v != 0.0) { + indices += featureMap(i) + values += v + } + } + case null => + // TODO: output Double.NaN? + throw new SparkException("Vector to filter cannot be null.") + case o => + throw new SparkException(s"$o of type ${o.getClass.getName} is not supported.") + } + Vectors.sparse(featureMap.size, indices.result(), values.result()).compressed + } + +} + From 747dcc18dbc35363a8753dd18abdd8a30fa97728 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 4 Mar 2019 17:00:41 +0800 Subject: [PATCH 075/115] bug fix: no valid config --- .../acquisition/optimizer/RandomSearch.scala | 31 ++++++++++--------- .../tuner/config/ConfigurationSpace.scala | 13 ++++++-- .../spark/automl/tuner/solver/Solver.scala | 13 +++++--- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala index 970f0df2f..96e63bc13 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/RandomSearch.scala @@ -44,21 +44,24 @@ class RandomSearch( override def maximize(numPoints: Int, sorted: Boolean = true): Array[(Double, Configuration)] = { //println(s"maximize RandomSearch") val configs: Array[Configuration] = configSpace.sample(TunerParam.sampleSize) - //configs.foreach { config => - // println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") - //} - val retConfigs = if (sorted) { - configs.map { config => - (acqFunc.compute(config.getVector)._1, config) - }.sortWith(_._1 > _._1).take(numPoints) + if (configs.isEmpty) { + Array[(Double, Configuration)]() + } else { + //configs.foreach { config => + // println(s"sample a configuration: ${config.getVector.toArray.mkString(",")}") + //} + val retConfigs = if (sorted) { + configs.map { config => + (acqFunc.compute(config.getVector)._1, config) + }.sortWith(_._1 > _._1).take(numPoints) + } + else { + rd.shuffle(configs.map { config => + (acqFunc.compute(config.getVector)._1, config) + }.toTraversable).take(numPoints).toArray + } + retConfigs } - else { - rd.shuffle(configs.map{ config => - (acqFunc.compute(config.getVector)._1, config) - }.toTraversable).take(numPoints).toArray - } - configSpace.addHistories(retConfigs.map(_._2.getVector)) - retConfigs } override def maximize: (Double, Configuration) = { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index d47060d08..238a9609d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -82,6 +82,7 @@ class ConfigurationSpace( var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var missing: Int = 0 + var isEmpty: Boolean = false do { missing = size - configs.length //println(s"num of params: $numParams") @@ -95,10 +96,16 @@ class ConfigurationSpace( case None => LOG.info(s"Cannot find $paramName.") } } - vectors.filter(isValid).foreach{ vec => - configs += new Configuration(param2Idx, param2Doc, vec) + val validVectors = vectors.filter(isValid) + // check is there is no valid config + if (validVectors.isEmpty) { + isEmpty = true + } else { + validVectors.foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) + } } - } while(configs.length < size) + } while(configs.length < size && !isEmpty) configs.toArray } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 1b238b018..fd585e87a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -86,10 +86,15 @@ class Solver( */ def feed(configs: Array[Configuration], Y: Array[Double]): Unit = { //println(s"feed ${configs.size} configurations") - if (surrogate.minimize) - surrogate.update(configs.map(_.getVector), Y.map(-_)) - else - surrogate.update(configs.map(_.getVector), Y) + if (!configs.isEmpty && !Y.isEmpty) { + if (surrogate.minimize) { + surrogate.update(configs.map(_.getVector), Y.map(-_)) + } + else { + surrogate.update(configs.map(_.getVector), Y) + } + } + cs.addHistories(configs.map(_.getVector)) } def feed(config: Configuration, y: Double): Unit = { From 0dec9774d4c51a86ffa99371d6bf8f5ecc4f121e Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 4 Mar 2019 17:03:44 +0800 Subject: [PATCH 076/115] bug fix: pass update given empty array --- .../angel/spark/automl/tuner/surrogate/Surrogate.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala index 5cdb3d681..bbe0eba7e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala @@ -75,10 +75,12 @@ abstract class Surrogate( * @param Y */ def update(X: Array[Vector], Y: Array[Double]): Unit = { - X.zip(Y).foreach( tuple => print(tuple._1, tuple._2) ) - preX ++= X - preY ++= Y - train + if (!X.isEmpty && !Y.isEmpty) { + X.zip(Y).foreach(tuple => print(tuple._1, tuple._2)) + preX ++= X + preY ++= Y + train + } } def print(X: Vector, y: Double): Unit = { From 4e2152f28603707898389af4a7ddf43dc444b7f5 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 6 Mar 2019 10:12:43 +0800 Subject: [PATCH 077/115] update two-order cross --- .../feature/examples/TwoOrderCross.scala | 87 +++++++++++-------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala index 623acc39c..97d76b3f3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -22,22 +22,22 @@ import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} -import org.apache.spark.ml.feature.operator.Cartesian +import org.apache.spark.ml.feature.operator.{Cartesian, VectorFilterZero} import org.apache.spark.sql.SparkSession object TwoOrderCross { def main(args: Array[String]): Unit = { - val spark = SparkSession.builder().master("local").getOrCreate() + val spark = SparkSession.builder().getOrCreate() - val trainDF = spark.read.format("libsvm") + val data = spark.read.format("libsvm") .option("numFeatures", "123") .load("data/a9a/a9a_123d_train_trans.libsvm") - trainDF.persist() + data.persist() - val maxDim = FeatureUtils.maxDim(trainDF) + val maxDim = FeatureUtils.maxDim(data) println(s"max dimension: $maxDim") // feature cross meta @@ -48,70 +48,83 @@ object TwoOrderCross { .setInputCol("features") .setOutputCol("cartesian_features_1") - val selector_1 = new ChiSqSelector() - .setNumTopFeatures(maxDim * maxDim / 10) - .setFeaturesCol("cartesian_features_1") - .setLabelCol("label") - .setOutputCol("selected_features_1") + val featureMap: Map[Int, Int] = Map[Int, Int]() + + val filter_1 = new VectorFilterZero(featureMap) + .setInputCol("cartesian_features_1") + .setOutputCol("filter_features_1") + +// val selector_1 = new ChiSqSelector() +// .setNumTopFeatures(maxDim * maxDim / 100) +// .setFeaturesCol("cartesian_features_1") +// .setLabelCol("label") +// .setOutputCol("selected_features_1") val assembler1 = new VectorAssembler() - .setInputCols(Array("features", "selected_features_1")) + .setInputCols(Array("features", "filter_features_1")) .setOutputCol("assemble_features_1") val cartesian_2 = new Cartesian() .setInputCol("assemble_features_1") .setOutputCol("cartesian_features_2") - val selector_2 = new ChiSqSelector() - .setNumTopFeatures(10 * maxDim) - .setFeaturesCol("cartesian_features_2") - .setLabelCol("label") - .setOutputCol("selected_features_2") + val filter_2 = new VectorFilterZero(featureMap) + .setInputCol("cartesian_features_2") + .setOutputCol("filter_features_2") + +// val selector_2 = new ChiSqSelector() +// .setNumTopFeatures(10 * maxDim) +// .setFeaturesCol("cartesian_features_2") +// .setLabelCol("label") +// .setOutputCol("selected_features_2") val assembler_2 = new VectorAssembler() - .setInputCols(Array("assemble_features_1", "selected_features_2")) + .setInputCols(Array("assemble_features_1", "filter_features_2")) .setOutputCol("assemble_features_2") val pipeline = new Pipeline() - .setStages(Array(cartesian_1, selector_1, assembler1)) - //.setStages(Array(cartesian_1, selector_1, assembler1, cartesian_2, selector_2, assembler_2)) + //.setStages(Array(cartesian_1, selector_1, assembler1)) + .setStages(Array(cartesian_1, filter_1, assembler1, cartesian_2, filter_2, assembler_2)) - val featureModel = pipeline.fit(trainDF) - val crossDF = featureModel.transform(trainDF) + val featureModel = pipeline.fit(data) + val crossDF = featureModel.transform(data) - crossDF.persist() - trainDF.unpersist() + val splitData = crossDF.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitData(0).persist() + val testDF = splitData(1).persist() + + data.unpersist() println(crossDF.schema) crossDF.show(1) - println("non zero features in cartesian features") - println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) +// println("non zero features in cartesian features") +// println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) // original features val lr_orig = new LogisticRegression() .setFeaturesCol("features") .setMaxIter(10) .setRegParam(0.01) - val auc_orig = lr_orig.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + val auc_orig = lr_orig.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC println(s"original feature: auc = $auc_orig") - // one-order cross + // original features + one-order cross val lr_cross_1 = new LogisticRegression() - .setFeaturesCol("cartesian_features_1") + .setFeaturesCol("assemble_features_1") .setMaxIter(10) .setRegParam(0.01) - val auc_cross_1 = lr_cross_1.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + val auc_cross_1 = lr_cross_1.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC println(s"one order cross feature: auc = $auc_cross_1") - // original features + all cross features -// val lr_cross_2 = new LogisticRegression() -// .setFeaturesCol("assemble_features_2") -// .setLabelCol("label") -// .setMaxIter(10) -// .setRegParam(0.01) -// val auc_cross_2 = lr_cross_2.fit(crossDF).summary.asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC -// println(s"original feature + cross feature: auc = $auc_cross_2") + // original features + one-order cross + two-order cross features + val lr_cross_2 = new LogisticRegression() + .setFeaturesCol("assemble_features_2") + .setMaxIter(10) + .setRegParam(0.01) + val auc_cross_2 = lr_cross_2.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature + two-order cross feature: auc = $auc_cross_2") spark.close() } From 4718ed21472398365222d0499e94bef896764541 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 6 Mar 2019 10:47:29 +0800 Subject: [PATCH 078/115] skip test --- angel-ps/pom.xml | 1 + .../spark/automl/feature/examples/TwoOrderCross.scala | 10 ++++++++-- .../angel/spark/automl/tuner/GPTunerExample.scala | 2 +- .../angel/spark/examples/automl/GPTunerExample.scala | 2 +- spark-on-angel/pom.xml | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/angel-ps/pom.xml b/angel-ps/pom.xml index 63ee1fcab..ac03e4f3a 100644 --- a/angel-ps/pom.xml +++ b/angel-ps/pom.xml @@ -372,6 +372,7 @@ ${project.build.directory}/surefire-reports . WDF TestSuite.txt + true diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala index 97d76b3f3..6d76da4c6 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -19,6 +19,7 @@ package com.tencent.angel.spark.automl.feature.examples import com.tencent.angel.spark.automl.feature.FeatureUtils import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta +import org.apache.spark.SparkConf import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} @@ -29,11 +30,16 @@ object TwoOrderCross { def main(args: Array[String]): Unit = { - val spark = SparkSession.builder().getOrCreate() + val conf = new SparkConf() + + val spark = SparkSession.builder().config(conf).getOrCreate() + + val input = conf.get("input").toString val data = spark.read.format("libsvm") .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") + .load(input) +// .load("data/a9a/a9a_123d_train_trans.libsvm") data.persist() diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index e491ef3f5..917d31a56 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -33,7 +33,7 @@ object GPTunerExample extends App { val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true,surrogate ="GP") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate ="GP") val trail: Trail = new TestTrail() (0 until 25).foreach{ iter => println(s"------iteration $iter starts------") diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala index 24dc7e159..c94174b1f 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala @@ -32,7 +32,7 @@ object GPTunerExample extends App { val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true) + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate ="GP") val trail: Trail = new TestTrail() (0 until 100).foreach{ iter => println(s"------iteration $iter starts------") diff --git a/spark-on-angel/pom.xml b/spark-on-angel/pom.xml index 65c35a01a..ce4cfedc4 100644 --- a/spark-on-angel/pom.xml +++ b/spark-on-angel/pom.xml @@ -197,6 +197,7 @@ ${project.build.directory}/surefire-reports . sparkOnAngel.txt + true -ea -Xmx3g -XX:MaxPermSize=${MaxPermGen} -XX:ReservedCodeCacheSize=${CodeCacheSize} From 4cb657a82b2a3f5e725f5af3853ebe74d8bdc6c2 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 6 Mar 2019 13:33:39 +0800 Subject: [PATCH 079/115] add input conf --- .../angel/spark/automl/feature/examples/TwoOrderCross.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala index 6d76da4c6..8bbfa1492 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -19,7 +19,7 @@ package com.tencent.angel.spark.automl.feature.examples import com.tencent.angel.spark.automl.feature.FeatureUtils import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta -import org.apache.spark.SparkConf +import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} @@ -32,9 +32,9 @@ object TwoOrderCross { val conf = new SparkConf() - val spark = SparkSession.builder().config(conf).getOrCreate() + val input = conf.get("spark.input.path").toString - val input = conf.get("input").toString + val spark = SparkSession.builder().config(conf).getOrCreate() val data = spark.read.format("libsvm") .option("numFeatures", "123") From c54d4bc7e5641d7ef38972011aac2456741d54e2 Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Wed, 13 Mar 2019 10:57:03 +0800 Subject: [PATCH 080/115] Create Lasso, RandomForest, Variance Selector and FeatureSelectorTest --- .../automl/feature/select/LassoSelector.scala | 131 +++++++++++++++++ .../feature/select/RandomForestSelector.scala | 132 ++++++++++++++++++ .../feature/select/VarianceSelector.scala | 116 +++++++++++++++ .../spark/automl/FeatureSelectorTest.scala | 90 ++++++++++++ 4 files changed, 469 insertions(+) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala new file mode 100644 index 000000000..2d62df1fe --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala @@ -0,0 +1,131 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.select + +import org.apache.spark.ml.classification.LogisticRegression +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.Identifiable +import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.functions._ +import breeze.linalg.argsort +import breeze.linalg.DenseVector + + +class LassoSelectorWrapper { + +} + +class LassoSelector(override val uid: String) extends Estimator[LassoSelectorModel]{ + + var featuresCol: String = _ + var outputCol: String = _ + var labelCol: String = _ + + def this() = this(Identifiable.randomUID("lassoSelector")) + + override def transformSchema(schema: StructType): StructType = { + schema + } + + def setFeaturesCol(value: String): this.type = { + featuresCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + def setLabelCol(value: String): this.type = { + labelCol = value + this + } + + override def fit(dataset: Dataset[_]): LassoSelectorModel = { + + val lr = new LogisticRegression() + .setFeaturesCol(featuresCol) + .setLabelCol(labelCol) + .setElasticNetParam(1.0) + .setMaxIter(10) + + val lrModel = lr.fit(dataset) + + val cofficients: Array[Double] = lrModel.coefficients.toArray + + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(cofficients)).toArray.reverse + + new LassoSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + + } + + override def copy(extra: ParamMap): Estimator[LassoSelectorModel] = { + new LassoSelector(uid).setFeaturesCol(featuresCol).setOutputCol(outputCol).setLabelCol(labelCol) + } +} + +class LassoSelectorModel(override val uid: String, + val sortedIndices: Array[Int]) extends Model[LassoSelectorModel]{ + + var inputCol: String = _ + + var outputCol: String = _ + + var numTopFeatures: Int = 50 + + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + + def setInputCol(value: String): this.type = { + inputCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + override def transformSchema(schema: StructType): StructType = schema + + override def transform(dataset: Dataset[_]): DataFrame = { + sortedIndices.foreach(index => print(index + ", ")) + println() + // select function, select the top features order by lasso cofficients + val select = udf { vector: Vector => + val orginalValues: Array[Double] = vector.toArray + val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues + Vectors.dense(values) + } + dataset.withColumn(outputCol, select(col(inputCol))) + } + + override def copy(extra: ParamMap): LassoSelectorModel = { + new LassoSelectorModel(uid, sortedIndices) + .setInputCol(inputCol) + .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) + } +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala new file mode 100644 index 000000000..ff7e29d9f --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala @@ -0,0 +1,132 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.select + +import org.apache.spark.ml.classification.RandomForestClassifier +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.Identifiable +import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.functions._ +import breeze.linalg.argsort +import breeze.linalg.DenseVector + + +class RandomForestSelectorWrapper { + +} + +class RandomforestSelector(override val uid: String) extends Estimator[RandomforestSelectorModel]{ + + var featuresCol: String = _ + var outputCol: String = _ + var labelCol: String = _ + + def this() = this(Identifiable.randomUID("randomforestSelector")) + + override def transformSchema(schema: StructType): StructType = { + schema + } + + def setFeaturesCol(value: String): this.type = { + featuresCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + def setLabelCol(value: String): this.type = { + labelCol = value + this + } + + override def fit(dataset: Dataset[_]): RandomforestSelectorModel = { + + val rf = new RandomForestClassifier() + .setFeaturesCol(featuresCol) + .setLabelCol(labelCol) + + val rfModel = rf.fit(dataset) + + val featureImportances: Array[Double] = rfModel.featureImportances.toArray + + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(featureImportances)).toArray.reverse + + new RandomforestSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + + } + + override def copy(extra: ParamMap): RandomforestSelector = { + new RandomforestSelector(uid) + .setFeaturesCol(featuresCol) + .setOutputCol(outputCol) + .setLabelCol(labelCol) + } +} + +class RandomforestSelectorModel(override val uid: String, + val sortedIndices: Array[Int]) extends Model[RandomforestSelectorModel]{ + + var inputCol: String = _ + + var outputCol: String = _ + + var numTopFeatures: Int = 50 + + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + + def setInputCol(value: String): this.type = { + inputCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + override def transformSchema(schema: StructType): StructType = schema + + override def transform(dataset: Dataset[_]): DataFrame = { + sortedIndices.foreach(index => print(index + ", ")) + println() + // select function, select the top features order by feture importrances of random forest + val select = udf { vector: Vector => + val orginalValues: Array[Double] = vector.toArray + val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues + Vectors.dense(values) + } + dataset.withColumn(outputCol, select(col(inputCol))) + } + + override def copy(extra: ParamMap): RandomforestSelectorModel = { + new RandomforestSelectorModel(uid, sortedIndices) + .setNumTopFeatures(numTopFeatures) + .setInputCol(inputCol) + .setOutputCol(outputCol) + } +} \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala new file mode 100644 index 000000000..079d63da4 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala @@ -0,0 +1,116 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.feature.select + +import breeze.linalg.{DenseVector, argsort} +import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.util.Identifiable +import org.apache.spark.mllib.linalg.{Vector => OldVector} +import org.apache.spark.mllib.linalg.{Vectors => OldVectors} +import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.functions.{col, udf} +import org.apache.spark.sql.{DataFrame, Dataset, Row} +import org.apache.spark.sql.types.StructType + +class VarianceSelector(override val uid: String) extends Estimator[VarianceSelectorModel] { + + var featuresCol: String = _ + var outputCol: String = _ + + def this() = this(Identifiable.randomUID("varianceSelector")) + + override def transformSchema(schema: StructType): StructType = { + schema + } + + def setFeaturesCol(value: String): this.type = { + featuresCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + override def fit(dataset: Dataset[_]): VarianceSelectorModel = { + val featuresRDD: RDD[OldVector] = dataset.select(featuresCol).rdd.map{case Row(v: Vector) => + OldVectors.dense(v.toArray) + } + val summary: MultivariateStatisticalSummary = Statistics.colStats(featuresRDD) + val variance: Array[Double] = summary.mean.toArray + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(variance)).toArray.reverse + + new VarianceSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + } + + override def copy(extra: ParamMap): Estimator[VarianceSelectorModel] = { + new VarianceSelector().setFeaturesCol(featuresCol).setOutputCol(outputCol) + } + +} + +class VarianceSelectorModel(override val uid: String, + val sortedIndices: Array[Int]) extends Model[VarianceSelectorModel] { + + var inputCol: String = _ + + var outputCol: String = _ + + var numTopFeatures: Int = 50 + + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + + def setInputCol(value: String): this.type = { + inputCol = value + this + } + + def setOutputCol(value: String): this.type = { + outputCol = value + this + } + + override def transformSchema(schema: StructType): StructType = schema + + override def transform(dataset: Dataset[_]): DataFrame = { + sortedIndices.foreach(index => print(index + ", ")) + println() + // select function, select the top features order by lasso cofficients + val select = udf { vector: Vector => + val orginalValues: Array[Double] = vector.toArray + val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues + Vectors.dense(values) + } + dataset.withColumn(outputCol, select(col(inputCol))) + } + + override def copy(extra: ParamMap): VarianceSelectorModel = { + new VarianceSelectorModel(uid, sortedIndices) + .setNumTopFeatures(numTopFeatures) + .setInputCol(inputCol) + .setOutputCol(outputCol) + } +} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala new file mode 100644 index 000000000..d70a63b2b --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -0,0 +1,90 @@ +package com.tencent.angel.spark.automl + +import com.tencent.angel.spark.automl.feature.select.{LassoSelector, RandomforestSelector, VarianceSelector} +import org.apache.spark.sql.SparkSession +import org.junit.Test + +class FeatureSelectorTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test def testLasso(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val splitData = data.randomSplit(Array(0.7, 0.3)) + + val selector = new LassoSelector() + .setFeaturesCol("features") + .setLabelCol("label") + .setOutputCol("selectedFeatures") + + val trainDF = splitData(0) + val testDF = splitData(1) + + val selectorModel = selector.fit(trainDF).setNumTopFeatures(50) + + val selectedTestDF = selectorModel.transform(testDF) + + selectedTestDF.show() + + spark.stop() + + } + + @Test + def testRandomForest(): Unit = { + + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val splitData = data.randomSplit(Array(0.7, 0.3)) + + val selector = new RandomforestSelector() + .setFeaturesCol("features") + .setLabelCol("label") + .setOutputCol("selectedFeatures") + + val trainDF = splitData(0) + val testDF = splitData(1) + + val selectorModel = selector.fit(trainDF).setNumTopFeatures(3) + + val selectedTestDF = selectorModel.transform(testDF) + + selectedTestDF.show() + + spark.stop() + } + + @Test + def testVariance(): Unit = { + + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val splitData = data.randomSplit(Array(0.7, 0.3)) + + val selector = new VarianceSelector() + .setFeaturesCol("features") + .setOutputCol("selectedFeatures") + + val trainDF = splitData(0) + val testDF = splitData(1) + + val selectorModel = selector.fit(trainDF).setNumTopFeatures(3) + + val selectedTestDF = selectorModel.transform(testDF) + + selectedTestDF.show() + + spark.stop() + } + +} From dfef00537c97f911d0eb502fa92a5b350b31b0dd Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 13 Mar 2019 15:53:57 +0800 Subject: [PATCH 081/115] reformat code --- .../spark/automl/feature/DataLoader.scala | 23 +++++----- .../spark/automl/feature/FeatureUtils.scala | 6 +-- .../automl/feature/PipelineBuilder.scala | 2 +- .../spark/automl/feature/PipelineDriver.scala | 12 ++--- .../automl/feature/TransformerWrapper.scala | 2 +- .../automl/feature/cross/FeatureCross.scala | 2 +- .../feature/examples/LassoSelector.scala | 2 +- .../feature/examples/OneOrderCross.scala | 6 +-- .../feature/examples/TwoOrderCross.scala | 26 +++++------ .../preprocess/BuckerizerWrapper.scala | 2 +- .../feature/preprocess/Components.scala | 2 +- .../feature/preprocess/FPreprocess.scala | 2 +- .../automl/feature/preprocess/Sampler.scala | 17 ++++--- .../preprocess/StandardScalerWrapper.scala | 36 +++++++-------- .../preprocess/StringIndexerWrapper.scala | 2 +- .../feature/preprocess/TPreprocess.scala | 2 +- .../feature/preprocess/TokenizerWrapper.scala | 1 - .../feature/select/FeatureSelector.scala | 2 +- .../spark/automl/tuner/GPTunerExample.scala | 5 +- .../automl/tuner/RandomTunerExample.scala | 2 +- .../angel/spark/automl/tuner/TunerParam.scala | 2 +- .../spark/automl/tuner/acquisition/EI.scala | 5 +- .../acquisition/optimizer/AcqOptimizer.scala | 3 +- .../tuner/config/ConfigurationSpace.scala | 26 +++++++---- .../automl/tuner/kernel/Covariance.scala | 2 + .../spark/automl/tuner/kernel/Matern3.scala | 8 ++-- .../spark/automl/tuner/kernel/Matern5.scala | 8 ++-- .../automl/tuner/kernel/Matern5Iso.scala | 10 ++-- .../automl/tuner/kernel/SquareExpIso.scala | 2 +- .../spark/automl/tuner/math/BreezeOp.scala | 8 ++-- .../spark/automl/tuner/math/SquareDist.scala | 1 + .../spark/automl/tuner/model/GPExample.scala | 10 ++-- .../spark/automl/tuner/model/GPModel.scala | 6 +-- .../tuner/parameter/ContinuousSpace.scala | 27 ++++------- .../tuner/parameter/DiscreteSpace.scala | 20 ++++---- .../automl/tuner/parameter/ParamSpace.scala | 4 +- .../spark/automl/tuner/solver/Solver.scala | 46 +++++++++---------- .../automl/tuner/solver/SolverWithTrail.scala | 2 +- .../automl/tuner/surrogate/GPSurrogate.scala | 2 +- .../tuner/surrogate/NormalSurrogate.scala | 18 ++------ .../automl/tuner/surrogate/RFSurrogate.scala | 2 +- .../automl/tuner/surrogate/Surrogate.scala | 3 +- .../automl/tuner/trail/TrailRunner.scala | 2 +- 43 files changed, 184 insertions(+), 187 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala index b2269187b..cc681e17c 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/DataLoader.scala @@ -22,6 +22,7 @@ import org.apache.spark.sql.{DataFrame, SparkSession} abstract class DataLoader(ss: SparkSession) { def load(input: String, separator: String): DataFrame + def load(input: String): DataFrame = load(input, " ") } @@ -45,22 +46,22 @@ case class JSONDataLoader(ss: SparkSession) extends DataLoader(ss) { case class DocumentDataLoader(ss: SparkSession) extends DataLoader(ss) { override def load(input: String, separator: String): DataFrame = { - ss.createDataFrame( - ss.sparkContext.textFile(input).map(Tuple1.apply) - ).toDF("sentence") + ss.createDataFrame( + ss.sparkContext.textFile(input).map(Tuple1.apply) + ).toDF("sentence") } } case class LabeledDocumentDataLoader(ss: SparkSession) extends DataLoader(ss) { override def load(input: String, separator: String): DataFrame = { require(separator.equals(","), - "the label and sentence should be separated by comma") + "the label and sentence should be separated by comma") ss.createDataFrame( ss.sparkContext.textFile(input) - .map{ line => - val splits = line.split(separator) - (splits(0), splits(1)) - }) + .map { line => + val splits = line.split(separator) + (splits(0), splits(1)) + }) .toDF("label", "sentence") } @@ -80,9 +81,9 @@ case class LabeledSimpleDataLoader(ss: SparkSession) extends DataLoader(ss) { override def load(input: String, separator: String): DataFrame = { ss.createDataFrame( ss.sparkContext.textFile(input) - .map{ line => - val splits = line.split(separator) - (splits.head, splits.tail) + .map { line => + val splits = line.split(separator) + (splits.head, splits.tail) } ).toDF("label", "features") } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala index b55fb1a64..65e77ddf5 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/FeatureUtils.scala @@ -23,8 +23,8 @@ import org.apache.spark.sql.{Dataset, Row} object FeatureUtils { def maxDim(dataset: Dataset[Row], col: String = "features"): Int = { - dataset.select(col).rdd.mapPartitions{ rows: Iterator[Row] => - val dim = rows.map{ case Row(v: Vector) => + dataset.select(col).rdd.mapPartitions { rows: Iterator[Row] => + val dim = rows.map { case Row(v: Vector) => v match { case sv: SparseVector => sv.indices.last case dv: DenseVector => dv.size @@ -36,7 +36,7 @@ object FeatureUtils { def countNonZero(dataset: Dataset[Row], col: String = "features"): Array[Int] = { dataset.select(col).rdd.mapPartitions { rows: Iterator[Row] => - val mergeIndices = rows.map{ case Row(v: Vector) => + val mergeIndices = rows.map { case Row(v: Vector) => v match { case sv: SparseVector => sv.indices.toList diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala index c3a7f6707..6a45b706e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineBuilder.scala @@ -24,7 +24,7 @@ import org.apache.spark.ml.PipelineStage import scala.collection.mutable import scala.collection.mutable.ArrayBuffer -class IncompatibleFiledExecption(msg: String) extends SparkException(msg) { } +class IncompatibleFiledExecption(msg: String) extends SparkException(msg) {} object PipelineBuilder { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala index d8c097812..59bf9740b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala @@ -12,12 +12,12 @@ object PipelineDriver { val spark = SparkSession.builder().master("local").getOrCreate() -// val inputDF = spark.createDataFrame(Seq( -// (0L, "a b c d e spark", 1.0), -// (1L, "b d", 0.0), -// (2L, "spark f g h", 1.0), -// (3L, "hadoop mapreduce", 0.0) -// )).toDF("id", "text", "label") + // val inputDF = spark.createDataFrame(Seq( + // (0L, "a b c d e spark", 1.0), + // (1L, "b d", 0.0), + // (2L, "spark f g h", 1.0), + // (3L, "hadoop mapreduce", 0.0) + // )).toDF("id", "text", "label") val inputDF = spark.createDataFrame(Seq( (0, Vectors.dense(1.0, 0.1, -1.0)), diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala index 330766f9b..513c87e5e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/TransformerWrapper.scala @@ -57,7 +57,7 @@ abstract class TransformerWrapper { def generateInputCols(): Unit = { //require(ancestorCols.contains(requiredInputCols), "Missing required input cols.") -// require(requiredInputCols.forall(ancestorCols.contains), "Missing required input cols.") + // require(requiredInputCols.forall(ancestorCols.contains), "Missing required input cols.") // if transformer has required input cols, feed required input cols // if transformer needs all input cols, feed all input cols // if transformer has no required input cols, feed the output cols of the parent transformer diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala index 72d410344..fdd46912f 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/cross/FeatureCross.scala @@ -24,7 +24,7 @@ import org.apache.spark.ml.util.DefaultParamsWritable import org.apache.spark.sql.types.StructType import org.apache.spark.sql.{DataFrame, Dataset} -class FeatureCross (override val uid: String) +class FeatureCross(override val uid: String) extends Transformer with DefaultParamsWritable { override def transform(dataset: Dataset[_]): DataFrame = ??? diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala index 0cfdd13d3..f6b35de53 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala @@ -54,7 +54,7 @@ object LassoSelector { println(s"nonzero items in weight vector:") println(lrModel.coefficients.toDense.values.zipWithIndex - .filter{ case (v: Double, i: Int) => math.abs(v) > 1e-10 }.take(100).mkString(",")) + .filter { case (v: Double, i: Int) => math.abs(v) > 1e-10 }.take(100).mkString(",")) } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala index a7ea9a1d5..a45757f8a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala @@ -79,9 +79,9 @@ object OneOrderCross { // original features val lr_orig = new LogisticRegression() - .setFeaturesCol("features") - .setMaxIter(10) - .setRegParam(0.01) + .setFeaturesCol("features") + .setMaxIter(10) + .setRegParam(0.01) val auc_orig = lr_orig.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC println(s"original feature: auc = $auc_orig") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala index 8bbfa1492..3d428d570 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -39,7 +39,7 @@ object TwoOrderCross { val data = spark.read.format("libsvm") .option("numFeatures", "123") .load(input) -// .load("data/a9a/a9a_123d_train_trans.libsvm") + // .load("data/a9a/a9a_123d_train_trans.libsvm") data.persist() @@ -60,11 +60,11 @@ object TwoOrderCross { .setInputCol("cartesian_features_1") .setOutputCol("filter_features_1") -// val selector_1 = new ChiSqSelector() -// .setNumTopFeatures(maxDim * maxDim / 100) -// .setFeaturesCol("cartesian_features_1") -// .setLabelCol("label") -// .setOutputCol("selected_features_1") + // val selector_1 = new ChiSqSelector() + // .setNumTopFeatures(maxDim * maxDim / 100) + // .setFeaturesCol("cartesian_features_1") + // .setLabelCol("label") + // .setOutputCol("selected_features_1") val assembler1 = new VectorAssembler() .setInputCols(Array("features", "filter_features_1")) @@ -78,11 +78,11 @@ object TwoOrderCross { .setInputCol("cartesian_features_2") .setOutputCol("filter_features_2") -// val selector_2 = new ChiSqSelector() -// .setNumTopFeatures(10 * maxDim) -// .setFeaturesCol("cartesian_features_2") -// .setLabelCol("label") -// .setOutputCol("selected_features_2") + // val selector_2 = new ChiSqSelector() + // .setNumTopFeatures(10 * maxDim) + // .setFeaturesCol("cartesian_features_2") + // .setLabelCol("label") + // .setOutputCol("selected_features_2") val assembler_2 = new VectorAssembler() .setInputCols(Array("assemble_features_1", "filter_features_2")) @@ -105,8 +105,8 @@ object TwoOrderCross { println(crossDF.schema) crossDF.show(1) -// println("non zero features in cartesian features") -// println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) + // println("non zero features in cartesian features") + // println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) // original features val lr_orig = new LogisticRegression() diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala index 06c5df777..8b13723cf 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/BuckerizerWrapper.scala @@ -23,7 +23,7 @@ import com.tencent.angel.spark.automl.feature.TransformerWrapper import org.apache.spark.ml.feature.Bucketizer -class BuckerizerWrapper extends TransformerWrapper{ +class BuckerizerWrapper extends TransformerWrapper { override val transformer = new Bucketizer() override var parent: TransformerWrapper = _ diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala index e9701a67c..005472433 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Components.scala @@ -27,7 +27,7 @@ import scala.collection.mutable.ArrayBuffer object Components { def sample(data: DataFrame, - fraction: Double): DataFrame = { + fraction: Double): DataFrame = { data.sample(false, fraction) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala index f6dfd09e1..6fdeebdf4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/FPreprocess.scala @@ -60,7 +60,7 @@ object FPreprocess { if (sampleRate > 0 & sampleRate < 1.0) Components.addSampler(components, - "features", sampleRate) + "features", sampleRate) if (hasTokenizer) Components.addTokenizer(components, diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala index 849958f35..4cb11ac59 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/Sampler.scala @@ -37,6 +37,7 @@ class Sampler(fraction: Double, /** * Param for input column name. + * * @group param */ final val inputCol: Param[String] = new Param[String](this, "inputCol", "input column name") @@ -54,7 +55,9 @@ class Sampler(fraction: Double, dataset.sample(false, fraction, seed).toDF } - override def transformSchema(schema: StructType): StructType = { schema } + override def transformSchema(schema: StructType): StructType = { + schema + } override def copy(extra: ParamMap): Sampler = defaultCopy(extra) } @@ -85,12 +88,12 @@ object Sampler { .load("/Users/jiangjiawei/dev-tools/spark-2.2.0/data/mllib/sample_libsvm_data.txt") model.transform(test).select("*") - .collect() - .foreach { case Row(label: Double, vector: Vector) => - println(s"($label, " + - s"${vector.toSparse.indices.mkString("[", ",", "]")}, " + - s"${vector.toSparse.values.mkString("[", ",", "]")}") - } + .collect() + .foreach { case Row(label: Double, vector: Vector) => + println(s"($label, " + + s"${vector.toSparse.indices.mkString("[", ",", "]")}, " + + s"${vector.toSparse.values.mkString("[", ",", "]")}") + } ss.stop() } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala index 4cc9e6d7e..48cbfe61e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StandardScalerWrapper.scala @@ -24,22 +24,22 @@ class StandardScalerWrapper extends TransformerWrapper { this } -// def fit(df: DataFrame): Transformer = { -// estimator.fit(df) -// } -// -// def transform(dataset: Dataset[_]): DataFrame = { -// val df = dataset.toDF() -// -// val scaler = new StandardScaler() -// .setInputCol("features") -// .setOutputCol("scaledFeatures") -// .setWithStd(true) -// .setWithMean(true) -// val scalerModel = scaler.fit(df) -// -// val scaledDf = scalerModel.transform(df) -// -// scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") -// } + // def fit(df: DataFrame): Transformer = { + // estimator.fit(df) + // } + // + // def transform(dataset: Dataset[_]): DataFrame = { + // val df = dataset.toDF() + // + // val scaler = new StandardScaler() + // .setInputCol("features") + // .setOutputCol("scaledFeatures") + // .setWithStd(true) + // .setWithMean(true) + // val scalerModel = scaler.fit(df) + // + // val scaledDf = scalerModel.transform(df) + // + // scaledDf.drop("features").withColumnRenamed("scaledFeatures", "features") + // } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala index e0971d55a..243917f63 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/StringIndexerWrapper.scala @@ -22,7 +22,7 @@ import com.tencent.angel.spark.automl.feature.InToOutRelation.{InToOutRelation, import com.tencent.angel.spark.automl.feature.TransformerWrapper import org.apache.spark.ml.feature.{StringIndexer, Tokenizer} -class StringIndexerWrapper extends TransformerWrapper{ +class StringIndexerWrapper extends TransformerWrapper { override val transformer = new StringIndexer() override var parent: TransformerWrapper = _ diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala index 055abb173..90b4c1fbc 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TPreprocess.scala @@ -24,7 +24,7 @@ import org.apache.spark.ml.util.DefaultParamsWritable import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType -class TPreprocess (override val uid: String) +class TPreprocess(override val uid: String) extends Transformer with DefaultParamsWritable { override def transform(dataset: Dataset[_]): DataFrame = ??? diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala index 449511f04..736a2b625 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/preprocess/TokenizerWrapper.scala @@ -24,7 +24,6 @@ import org.apache.spark.ml.Transformer import org.apache.spark.ml.feature.Tokenizer - class TokenizerWrapper extends TransformerWrapper { override val transformer: Transformer = new Tokenizer() diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala index 3efcd6576..b0fc30ae8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/FeatureSelector.scala @@ -24,7 +24,7 @@ import org.apache.spark.ml.util.DefaultParamsWritable import org.apache.spark.sql.types.StructType import org.apache.spark.sql.{DataFrame, Dataset} -class FeatureSelector (override val uid: String) +class FeatureSelector(override val uid: String) extends Transformer with DefaultParamsWritable { override def transform(dataset: Dataset[_]): DataFrame = ??? diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 917d31a56..218268329 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -28,14 +28,13 @@ import org.apache.spark.ml.linalg.Vector object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1,10]") val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate ="GP") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "GP") val trail: Trail = new TestTrail() - (0 until 25).foreach{ iter => + (0 until 25).foreach { iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index d2b538651..daf9d50fb 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -38,7 +38,7 @@ object RandomTunerExample extends App { cs.addParam(param4) val solver: Solver = Solver(cs, surrogate = "Random") val trail: Trail = new TestTrail() - (0 until 25).foreach{ iter => + (0 until 25).foreach { iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala index 6912b34f2..a3bb5e05f 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala @@ -24,7 +24,7 @@ class TunerParam { object TunerParam { var batchSize: Int = 1 - var sampleSize: Int = 10* batchSize + var sampleSize: Int = 10 * batchSize var taskName: String = "com.tencent.angel.spark.automl.tuner.trail.TestRunner" diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala index ab9a5ad6a..164808144 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/EI.scala @@ -26,10 +26,11 @@ import com.tencent.angel.spark.automl.tuner.surrogate.Surrogate /** * Expected improvement. + * * @param surrogate * @param par : Controls the balance between exploration and exploitation of the acquisition function, default=0.0 * - */ + */ class EI( override val surrogate: Surrogate, val par: Double) @@ -54,7 +55,7 @@ class EI( (0.0, Vectors.dense(new Array[Double](X.size))) } else { val z = (pred._1 - eta - par) / s - val norm: NormalDistribution = new NormalDistribution + val norm: NormalDistribution = new NormalDistribution val cdf: Double = norm.cumulativeProbability(z) val pdf: Double = norm.density(z) val ei = s * (z * cdf + pdf) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala index 1cba8d9a8..c85e23ac8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/optimizer/AcqOptimizer.scala @@ -19,10 +19,11 @@ package com.tencent.angel.spark.automl.tuner.acquisition.optimizer import com.tencent.angel.spark.automl.tuner.acquisition.Acquisition -import com.tencent.angel.spark.automl.tuner.config.{Configuration,ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} /** * Abstract base class for acquisition maximization. + * * @param acqFunc : The acquisition function which will be maximized * @param configSpace : Configuration space of parameters */ diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 238a9609d..27f1e90bd 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -105,7 +105,7 @@ class ConfigurationSpace( configs += new Configuration(param2Idx, param2Doc, vec) } } - } while(configs.length < size && !isEmpty) + } while (configs.length < size && !isEmpty) configs.toArray } @@ -128,14 +128,18 @@ class ConfigurationSpace( var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] val params = getParams() - params.foreach { tmp += _.getValues } + params.foreach { + tmp += _.getValues + } val paramsArray: Array[Array[Double]] = tmp.toArray - if (numParams == 1){ - val paramsGrid : Array[Array[Double]] = paramsArray + if (numParams == 1) { + val paramsGrid: Array[Array[Double]] = paramsArray var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach { tmp += Vectors.dense(_) } + paramsGrid.foreach { + tmp += Vectors.dense(_) + } val paramsVec = tmp.toArray paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) @@ -143,10 +147,12 @@ class ConfigurationSpace( configs.toArray } - else if (numParams == 2){ + else if (numParams == 2) { val paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach { tmp += Vectors.dense(_) } + paramsGrid.foreach { + tmp += Vectors.dense(_) + } val paramsVec: Array[Vector] = tmp.toArray paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) @@ -154,7 +160,7 @@ class ConfigurationSpace( configs.toArray } - else{ + else { var paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) paramsArray.foreach { a => @@ -164,7 +170,9 @@ class ConfigurationSpace( } var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach{ tmp += Vectors.dense(_) } + paramsGrid.foreach { + tmp += Vectors.dense(_) + } val paramsVec: Array[Vector] = tmp.toArray paramsVec.filter(isValid).foreach { vec => configs += new Configuration(param2Idx, param2Doc, vec) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala index 199572f86..4f2de3cbf 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Covariance.scala @@ -27,6 +27,7 @@ trait Covariance { /** * the covariance function + * * @param x1 * @param x2 * @param params @@ -38,6 +39,7 @@ trait Covariance { /** * the derivative of covariance function against kernel hyper-parameters + * * @param x1 * @param x2 * @param params diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala index 99257492a..aacde5635 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern3.scala @@ -52,7 +52,7 @@ case class Matern3() extends Covariance { val r = sqrt(distMat) val vPart = sqrt(3) * r / l + 1.0 - val expPart = exp( -sqrt(3) * r / l ) + val expPart = exp(-sqrt(3) * r / l) val covMatrix = vPart *:* expPart covMatrix @@ -79,10 +79,10 @@ case class Matern3() extends Covariance { val r = sqrt(distMat) val vPart = sqrt(3) * r / l + 1.0 - val expPart = exp( -sqrt(3) * r / l ) + val expPart = exp(-sqrt(3) * r / l) - val vPartGrad = -( sqrt(3) * r / pow(l, 2) ) *:* expPart - val expPartGrad = vPart *:* expPart *:* ( sqrt(3) * r / pow(l, 2) ) + val vPartGrad = -(sqrt(3) * r / pow(l, 2)) *:* expPart + val expPartGrad = vPart *:* expPart *:* (sqrt(3) * r / pow(l, 2)) val gradL = vPartGrad + expPartGrad diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala index 933d0213f..ed95c674e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5.scala @@ -51,7 +51,7 @@ case class Matern5() extends Covariance { val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 - val expPart = exp( -sqrt(5) * r / l ) + val expPart = exp(-sqrt(5) * r / l) val covMatrix = vPart *:* expPart covMatrix @@ -78,10 +78,10 @@ case class Matern5() extends Covariance { val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 - val expPart = exp( -sqrt(5) * r / l ) + val expPart = exp(-sqrt(5) * r / l) - val vPartGrad = -( sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3)) ) *:* expPart - val expPartGrad = vPart *:* expPart *:* ( sqrt(5) * r / pow(l, 2) ) + val vPartGrad = -(sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3))) *:* expPart + val expPartGrad = vPart *:* expPart *:* (sqrt(5) * r / pow(l, 2)) val gradL = vPartGrad + expPartGrad diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala index 6f26acfd0..a18385cd5 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/Matern5Iso.scala @@ -27,7 +27,7 @@ import com.tencent.angel.spark.automl.tuner.math.SquareDist * theta^2 * (1 + sqrt(5)*r/l + 5r^2/(3l^2)) * exp(-sqrt(5)*r/l) * Here r is the distance |x1-x2| of two points * Hyper-parameter: theta is the signal variance, l is the length scale - */ + **/ case class Matern5Iso() extends Covariance { /** @@ -52,7 +52,7 @@ case class Matern5Iso() extends Covariance { val r = sqrt(distMat) val vPart = (sqrt(5) * r) / l + distMat / pow(l, 2) * 5.0 / 3.0 + 1.0 - val expPart = exp( -sqrt(5) * r / l ) + val expPart = exp(-sqrt(5) * r / l) val covMatrix = pow(theta, 2) * vPart *:* expPart // println(covMatrix) covMatrix @@ -80,10 +80,10 @@ case class Matern5Iso() extends Covariance { val r = sqrt(distMat) val vPart = sqrt(5) * r / l + 5.0 / 3.0 * distMat / pow(l, 2) + 1.0 - val expPart = exp( -sqrt(5) * r / l ) + val expPart = exp(-sqrt(5) * r / l) - val vPartGrad = -( sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3)) ) *:* expPart * pow(theta, 2) - val expPartGrad = vPart *:* expPart *:* ( sqrt(5) * r / pow(l, 2) ) * pow(theta, 2) + val vPartGrad = -(sqrt(5) * r / pow(l, 2) + 10.0 * distMat / (3.0 * pow(l, 3))) *:* expPart * pow(theta, 2) + val expPartGrad = vPart *:* expPart *:* (sqrt(5) * r / pow(l, 2)) * pow(theta, 2) val gradL = vPartGrad + expPartGrad val gradTheta = vPart *:* expPart * 2.0 * theta diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala index b42269303..76f2e3126 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/SquareExpIso.scala @@ -31,7 +31,7 @@ case class SquareExpIso() extends Covariance { val distMat = SquareDist(x1, x2) - val covMatrix = pow(theta,2) * exp(-0.5 * distMat/ pow(l, 2)) + val covMatrix = pow(theta, 2) * exp(-0.5 * distMat / pow(l, 2)) covMatrix } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala index dabee43b0..1f7f0035b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/BreezeOp.scala @@ -77,11 +77,11 @@ object BreezeOp { BDV(grads) } - def cartesian(A:Array[Double], B:Array[Double]) = for (a <- A; b <- B) yield { - Array(a,b) + def cartesian(A: Array[Double], B: Array[Double]) = for (a <- A; b <- B) yield { + Array(a, b) } - def cartesian(A:Array[Array[Double]], B:Array[Double]) = for (a <- A; b <- B) yield { - (a.toBuffer+=b).toArray + def cartesian(A: Array[Array[Double]], B: Array[Double]) = for (a <- A; b <- B) yield { + (a.toBuffer += b).toArray } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala index 08898f04f..a162415c8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/math/SquareDist.scala @@ -44,4 +44,5 @@ object SquareDist extends UFunc { t2(::, *) + sum(x1.t *:* x1.t, Axis._0).t } } + } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala index 412bd58c8..a06c894e3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPExample.scala @@ -25,10 +25,10 @@ object GPExample { def main(args: Array[String]): Unit = { - val X = DenseMatrix((1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t - val y = 2.0 * DenseVector(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0) - val z = DenseMatrix((2.5,4.5,6.5,8.5,10.0,12.0)).t - val truePredZ = 2.0 * DenseVector(2.5,4.5,6.5,8.5,10.0,12.0) + val X = DenseMatrix((1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)).t + val y = 2.0 * DenseVector(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0) + val z = DenseMatrix((2.5, 4.5, 6.5, 8.5, 10.0, 12.0)).t + val truePredZ = 2.0 * DenseVector(2.5, 4.5, 6.5, 8.5, 10.0, 12.0) // //2.Test no_linear(y=cos(x)+1) // val X = DenseMatrix((1.0,2.0, 3.0,4.0,5.0,6.0,7.0,8.0,9.0)).t @@ -44,7 +44,7 @@ object GPExample { //val covFunc = SquareExpIso() val covFunc = Matern5Iso() - val initCovParams = DenseVector(1.0,1.0) + val initCovParams = DenseVector(1.0, 1.0) val initNoiseStdDev = 0.01 val gpModel = GPModel(covFunc, initCovParams, initNoiseStdDev) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 9e37f7f11..8790f6af8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -39,8 +39,8 @@ class GPModel(val covFunc: Covariance, newy: BDV[Double]): this.type = { require(newX.rows == newy.length, "incompatible size of the input X and y") - if ( (X == null && y == null) || - (newX.rows > X.rows && newy.length > y.length) ) { + if ((X == null && y == null) || + (newX.rows > X.rows && newy.length > y.length)) { X = newX y = newy } @@ -84,7 +84,7 @@ class GPModel(val covFunc: Covariance, val meanNewX = meanFunc(newX) val predMean = meanNewX + KXZ.t * (invKXX * (y - meanX)) - val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map{ v => + val predVar = diag(KZZ - KXZ.t * invKXX * KXZ).map { v => if (v < -1e-12 | v.isNaN | v.isInfinite) 0 else v } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 53ea18d26..0a5ac4a78 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -25,10 +25,10 @@ import scala.util.Random /** * - * @param name: Name of the parameter - * @param lower: Start of the continuous space included. - * @param upper: End of the continuous space included. - * @param num: Sampling count if possible. + * @param name : Name of the parameter + * @param lower : Start of the continuous space included. + * @param upper : End of the continuous space included. + * @param num : Sampling count if possible. * @param seed */ class ContinuousSpace( @@ -38,7 +38,7 @@ class ContinuousSpace( var num: Int, distribution: Distribution.Value = Distribution.LINEAR, override val doc: String = "continuous param space", - var seed: Int =100) extends ParamSpace[Double](name, doc) { + var seed: Int = 100) extends ParamSpace[Double](name, doc) { private val helper: String = "supported format of continuous parameter: [0,1] or [0,1,100]" @@ -46,8 +46,8 @@ class ContinuousSpace( this(name, lower, upper, -1, seed = 100) } - def this(name: String, lower: Double, upper: Double, seed:Int) = { - this(name, lower, upper, -1,seed = seed) + def this(name: String, lower: Double, upper: Double, seed: Int) = { + this(name, lower, upper, -1, seed = seed) } def this(name: String, config: String) = { @@ -87,7 +87,7 @@ class ContinuousSpace( case _ if config.contains(":") => val splits = config.split(':') splits.length match { - case 3 => (splits (0).toDouble, splits (1).toDouble, splits (2).toInt) + case 3 => (splits(0).toDouble, splits(1).toDouble, splits(2).toInt) case _ => throw new AutoMLException(s"invalid discrete, $helper") } case _ => throw new AutoMLException(s"invalid discrete, $helper") @@ -136,8 +136,7 @@ class ContinuousSpace( lower + (upper - lower) * rd.nextDouble() } - override def toString: String = s"ContinuousSpace[$name]: (${gridValues mkString(",")})" - + override def toString: String = s"ContinuousSpace[$name]: (${gridValues mkString (",")})" } object ContinuousSpace { @@ -145,12 +144,4 @@ object ContinuousSpace { def apply(name: String, config: String) = { new ContinuousSpace(name, config) } - - def main(args: Array[String]): Unit = { -// val obj = new ContinuousSpace("test", "0,10") - val obj = new ContinuousSpace("param1", 0, 10, 11) - println(obj.toString) - println(obj.getValues(1)) - println(obj.sample(2).mkString(",")) - } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 09e7951dd..fc445deee 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -26,14 +26,14 @@ import scala.util.Random /** * Search space with discrete values * - * @param name: Name of the parameter - * @param values: List of all possible values + * @param name : Name of the parameter + * @param values : List of all possible values */ -class DiscreteSpace[T <: AnyVal: ClassTag]( - override val name: String, - var values: Array[T], - override val doc: String = "discrete param", - var seed: Int = 100) extends ParamSpace[T](name, doc) { +class DiscreteSpace[T <: AnyVal : ClassTag]( + override val name: String, + var values: Array[T], + override val doc: String = "discrete param", + var seed: Int = 100) extends ParamSpace[T](name, doc) { private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" @@ -121,18 +121,18 @@ class DiscreteSpace[T <: AnyVal: ClassTag]( def sampleOne(): T = values(rd.nextInt(numValues)) - override def toString: String = s"DiscreteSpace[$name]: (${values mkString(",")})" + override def toString: String = s"DiscreteSpace[$name]: (${values mkString (",")})" } object DiscreteSpace { - def apply[T <: AnyVal: ClassTag](name: String, config: String): DiscreteSpace[T] = { + def apply[T <: AnyVal : ClassTag](name: String, config: String): DiscreteSpace[T] = { new DiscreteSpace[T](name, config) } def main(args: Array[String]): Unit = { - val obj = new DiscreteSpace[Int]("test", "1:10:1",seed = 10) + val obj = new DiscreteSpace[Int]("test", "1:10:1", seed = 10) println(obj.toString) println(obj.getValues(1)) println(obj.sample(2).toString()) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index f657dccfa..3023037e9 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -26,10 +26,10 @@ import scala.reflect.ClassTag /** * Base class of a single parameter's search space. * - * @param name: Name of the parameter + * @param name : Name of the parameter */ abstract class ParamSpace[+T: ClassTag](val name: String, - val doc: String = "param with search space") { + val doc: String = "param with search space") { def sample(size: Int): List[T] diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index e5baaa639..6cc515cae 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -34,14 +34,13 @@ class Solver( val acqFuc: Acquisition, val optimizer: AcqOptimizer, val train: Boolean = true, - val grid:Boolean = false) { + val grid: Boolean = false) { val LOG: Log = LogFactory.getLog(classOf[Solver]) val PARAM_TYPES: Array[String] = Array("discrete", "continuous") - def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate @@ -50,7 +49,7 @@ class Solver( cs.addParam(param) } - def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): Unit = { + def addParam(pType: String, vType: String, name: String, config: String, seed: Int = 100): Unit = { pType.toLowerCase match { case "discrete" => vType.toLowerCase match { @@ -73,17 +72,16 @@ class Solver( * Suggests configurations to evaluate. */ def suggest(): Array[Configuration] = { - if (train){ + if (train) { val acqAndConfig = optimizer.maximize(TunerParam.batchSize) println(s"suggest configurations:") - acqAndConfig.foreach{ case (acq, config) => + acqAndConfig.foreach { case (acq, config) => println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + s"acquisition[$acq]") } acqAndConfig.map(_._2) - } - else { - if(grid){ + } else { + if (grid) { val configs: Array[Configuration] = cs.gridSample() configs } @@ -96,8 +94,9 @@ class Solver( /** * Feed evaluation result to the model - * @param configs: More evaluated configurations - * @param Y: More evaluation result + * + * @param configs : More evaluated configurations + * @param Y : More evaluation result */ def feed(configs: Array[Configuration], Y: Array[Double]): Unit = { //println(s"feed ${configs.size} configurations") @@ -139,26 +138,26 @@ object Solver { new Solver(cs, sur, acq, opt) } - def apply(cs: ConfigurationSpace, minimize: Boolean = true,surrogate: String): Solver = { + def apply(cs: ConfigurationSpace, minimize: Boolean = true, surrogate: String): Solver = { var sur: Surrogate = new GPSurrogate(cs, minimize) var acq: Acquisition = new EI(sur, 0.1f) var opt: AcqOptimizer = new RandomSearch(acq, cs) - var train:Boolean = true - var grid:Boolean = false - if(surrogate=="Grid"){ - sur= new NormalSurrogate(cs, minimize) + var train: Boolean = true + var grid: Boolean = false + if (surrogate == "Grid") { + sur = new NormalSurrogate(cs, minimize) acq = new EI(sur, 0.1f) opt = new RandomSearch(acq, cs) train = false grid = true - }else if(surrogate=="Random"){ + } else if (surrogate == "Random") { sur = new NormalSurrogate(cs, minimize) acq = new EI(sur, 0.1f) opt = new RandomSearch(acq, cs) train = false grid = false } - new Solver(cs, sur, acq, opt,train,grid) + new Solver(cs, sur, acq, opt, train, grid) } def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean, surrogate: String): Solver = { @@ -167,23 +166,22 @@ object Solver { var sur: Surrogate = new GPSurrogate(cs, minimize) var acq: Acquisition = new EI(sur, 0.1f) var opt: AcqOptimizer = new RandomSearch(acq, cs) - var train:Boolean = true - var grid:Boolean = false - if(surrogate=="Grid"){ - sur= new NormalSurrogate(cs, minimize) + var train: Boolean = true + var grid: Boolean = false + if (surrogate == "Grid") { + sur = new NormalSurrogate(cs, minimize) acq = new EI(sur, 0.1f) opt = new RandomSearch(acq, cs) train = false grid = true - }else if(surrogate=="Random"){ + } else if (surrogate == "Random") { sur = new NormalSurrogate(cs, minimize) acq = new EI(sur, 0.1f) opt = new RandomSearch(acq, cs) train = false grid = false } - println(grid) - new Solver(cs, sur, acq, opt,train,grid) + new Solver(cs, sur, acq, opt, train, grid) } def apply(minimize: Boolean): Solver = { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala index f04960677..88a4c9dc8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/SolverWithTrail.scala @@ -35,7 +35,7 @@ class SolverWithTrail(val solver: Solver, val trail: Trail) { def run(numIter: Int, X: Array[Configuration] = null, Y: Array[Double] = null): (Vector, Double) = { if (X != null && Y != null && X.size == Y.size) solver.feed(X, Y) - (0 until numIter).foreach{ iter => + (0 until numIter).foreach { iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala index 7083cfe22..b7c5d763b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala @@ -34,7 +34,7 @@ class GPSurrogate( override val LOG: Log = LogFactory.getLog(classOf[RFSurrogate]) val covFunc = Matern5Iso() - val initCovParams = BDV(1.0,1.0) + val initCovParams = BDV(1.0, 1.0) val initNoiseStdDev = 0.1 val gpModel: GPModel = GPModel(covFunc, initCovParams, initNoiseStdDev) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala index de08c0971..c4810eb4a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/NormalSurrogate.scala @@ -22,9 +22,8 @@ import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace import org.apache.spark.ml.linalg.Vector -class NormalSurrogate( - override val cs: ConfigurationSpace, - override val minimize: Boolean = true)extends Surrogate(cs, minimize) { +class NormalSurrogate(override val cs: ConfigurationSpace, + override val minimize: Boolean = true) extends Surrogate(cs, minimize) { override def update(X: Array[Vector], Y: Array[Double]): Unit = { preX ++= X @@ -33,20 +32,13 @@ class NormalSurrogate( /** * NormalSurrogate is designed for random-search and grid-search - * * Thus it doesn't need train and predict function */ - override def train(): Unit = { - - } + override def train(): Unit = { } - def predict(X: Vector): (Double, Double)={ - (0.0,0.0) - } + def predict(X: Vector): (Double, Double) = { (0.0, 0.0) } - override def stop(): Unit = { - - } + override def stop(): Unit = { } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala index 291d95e40..cc271295d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/RFSurrogate.scala @@ -72,7 +72,7 @@ class RFSurrogate( return (0.0, 0.0) } - val preds = model.trees.map{ tree: DecisionTreeRegressionModel => + val preds = model.trees.map { tree: DecisionTreeRegressionModel => val pred = tree.transform(DataUtils.parse(ss, schema, X)) pred.select("prediction").first().getDouble(0) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala index bbe0eba7e..67a47a4f4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/Surrogate.scala @@ -27,6 +27,7 @@ import scala.collection.mutable.{ArrayBuffer, ListBuffer} /** * Abstract base class for surrogate model. + * * @param numParams : Number of parameters in a configuration */ abstract class Surrogate( @@ -39,7 +40,7 @@ abstract class Surrogate( val schema: StructType = StructType( StructField("label", DataTypes.DoubleType, nullable = false) :: - StructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) :: + StructField("features", DataTypes.createArrayType(DataTypes.DoubleType), false) :: Nil) val LOG: Log = LogFactory.getLog(classOf[Surrogate]) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala index 0cf780c5c..578645120 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/trail/TrailRunner.scala @@ -22,7 +22,7 @@ import java.util.concurrent.Callable import com.tencent.angel.spark.automl.tuner.config.Configuration -abstract class TrailRunner(var config: Configuration) extends Callable[Double]{ +abstract class TrailRunner(var config: Configuration) extends Callable[Double] { override def call(): Double From 2ea162aa2786c66c2d360b6beb7e947cd3a56bf1 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 13 Mar 2019 16:28:02 +0800 Subject: [PATCH 082/115] use new Solver interface --- .../angel/spark/automl/tuner/GridTunerExample.scala | 7 +------ .../angel/spark/automl/tuner/RandomTunerExample.scala | 2 +- .../spark/automl/tuner/config/ConfigurationSpace.scala | 8 ++------ .../tencent/angel/spark/automl/tuner/solver/Solver.scala | 9 +-------- 4 files changed, 5 insertions(+), 21 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index dea5aa30b..54aed919a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -31,12 +31,7 @@ object GridTunerExample extends App { val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - cs.addParam(param1) - cs.addParam(param2) - cs.addParam(param3) - cs.addParam(param4) - val solver: Solver = Solver(cs, surrogate = "Grid") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") val trail: Trail = new TestTrail() val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index daf9d50fb..ed986a983 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -36,7 +36,7 @@ object RandomTunerExample extends App { cs.addParam(param2) cs.addParam(param3) cs.addParam(param4) - val solver: Solver = Solver(cs, surrogate = "Random") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Random") val trail: Trail = new TestTrail() (0 until 25).foreach { iter => println(s"------iteration $iter starts------") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 27f1e90bd..18319ee8b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -145,9 +145,7 @@ class ConfigurationSpace( configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray - } - - else if (numParams == 2) { + } else if (numParams == 2) { val paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] paramsGrid.foreach { @@ -158,9 +156,7 @@ class ConfigurationSpace( configs += new Configuration(param2Idx, param2Doc, vec) } configs.toArray - } - - else { + } else { var paramsGrid: Array[Array[Double]] = cartesian(paramsArray(0), paramsArray(1)) paramsArray.foreach { a => diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 6cc515cae..ece76f74d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -81,14 +81,7 @@ class Solver( } acqAndConfig.map(_._2) } else { - if (grid) { - val configs: Array[Configuration] = cs.gridSample() - configs - } - else { - val configs: Array[Configuration] = cs.sample(TunerParam.sampleSize) - configs - } + if (grid) cs.gridSample() else cs.sample(TunerParam.sampleSize) } } From dac5e088deb48ddc03bb8d41034f4e72f602905c Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Wed, 13 Mar 2019 19:32:22 +0800 Subject: [PATCH 083/115] sort cofficients according to the absolute value, match the return vector type according to the input vector type. --- .../automl/feature/select/LassoSelector.scala | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala index 2d62df1fe..5a1ae81c3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala @@ -23,11 +23,13 @@ import org.apache.spark.ml.{Estimator, Model} import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.Identifiable import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.ml.linalg.{DenseVector, SparseVector} import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType import org.apache.spark.sql.functions._ import breeze.linalg.argsort -import breeze.linalg.DenseVector +import breeze.linalg.{DenseVector => BDV} +import Math.abs class LassoSelectorWrapper { @@ -71,9 +73,9 @@ class LassoSelector(override val uid: String) extends Estimator[LassoSelectorMod val lrModel = lr.fit(dataset) - val cofficients: Array[Double] = lrModel.coefficients.toArray + val cofficients: Array[Double] = lrModel.coefficients.toArray.map(i => abs(i)) - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(cofficients)).toArray.reverse + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(cofficients)).toArray.reverse new LassoSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) @@ -115,9 +117,24 @@ class LassoSelectorModel(override val uid: String, println() // select function, select the top features order by lasso cofficients val select = udf { vector: Vector => + val orginalValues: Array[Double] = vector.toArray - val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues - Vectors.dense(values) + vector match { + // for DenseVector, just select top features + case v1: DenseVector => + val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues + Vectors.dense(values) + case v2: SparseVector => + val nonZeroIndices = vector.asInstanceOf[SparseVector].indices.filter(_ < numTopFeatures) + val values: Array[Double] = sortedIndices.take(numTopFeatures).sorted map orginalValues + val nonZeroValues: Array[Double] = nonZeroIndices map values + Vectors.sparse(numTopFeatures, nonZeroIndices, nonZeroValues) + + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } + } dataset.withColumn(outputCol, select(col(inputCol))) } From c0ac7dc6e1ed9e6c42c1d26c0c5c83c3674950c1 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 15 Mar 2019 08:56:08 +0800 Subject: [PATCH 084/115] selector supports both DenseVector and SparseVector --- .../automl/feature/select/LassoSelector.scala | 73 +++++++++------- .../feature/select/RandomForestSelector.scala | 70 +++++++++++----- .../feature/select/VarianceSelector.scala | 56 ++++++++++--- .../spark/ml/feature/operator/Cartesian.scala | 2 +- .../spark/automl/FeatureSelectorTest.scala | 84 ++++++++++++++----- 5 files changed, 202 insertions(+), 83 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala index 5a1ae81c3..c6eb8f70d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala @@ -25,24 +25,23 @@ import org.apache.spark.ml.util.Identifiable import org.apache.spark.ml.linalg.{Vector, Vectors} import org.apache.spark.ml.linalg.{DenseVector, SparseVector} import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.types.{ArrayType, StructType} import org.apache.spark.sql.functions._ import breeze.linalg.argsort import breeze.linalg.{DenseVector => BDV} import Math.abs +import scala.util.Sorting -class LassoSelectorWrapper { - -} class LassoSelector(override val uid: String) extends Estimator[LassoSelectorModel]{ var featuresCol: String = _ var outputCol: String = _ var labelCol: String = _ + var numTopFeatures: Int = _ - def this() = this(Identifiable.randomUID("lassoSelector")) + def this() = this(Identifiable.randomUID("LassoSelector")) override def transformSchema(schema: StructType): StructType = { schema @@ -63,6 +62,11 @@ class LassoSelector(override val uid: String) extends Estimator[LassoSelectorMod this } + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + override def fit(dataset: Dataset[_]): LassoSelectorModel = { val lr = new LogisticRegression() @@ -73,16 +77,22 @@ class LassoSelector(override val uid: String) extends Estimator[LassoSelectorMod val lrModel = lr.fit(dataset) - val cofficients: Array[Double] = lrModel.coefficients.toArray.map(i => abs(i)) - - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(cofficients)).toArray.reverse + val coefficients: Array[Double] = lrModel.coefficients.toArray.map(i => abs(i)) - new LassoSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(coefficients)).toArray.reverse + new LassoSelectorModel(uid, sortedIndices) + .setInputCol(featuresCol) + .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } override def copy(extra: ParamMap): Estimator[LassoSelectorModel] = { - new LassoSelector(uid).setFeaturesCol(featuresCol).setOutputCol(outputCol).setLabelCol(labelCol) + new LassoSelector(uid) + .setFeaturesCol(featuresCol) + .setOutputCol(outputCol) + .setLabelCol(labelCol) + .setNumTopFeatures(numTopFeatures) } } @@ -93,12 +103,7 @@ class LassoSelectorModel(override val uid: String, var outputCol: String = _ - var numTopFeatures: Int = 50 - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } + var numTopFeatures: Int = _ def setInputCol(value: String): this.type = { inputCol = value @@ -110,31 +115,41 @@ class LassoSelectorModel(override val uid: String, this } + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + override def transformSchema(schema: StructType): StructType = schema override def transform(dataset: Dataset[_]): DataFrame = { - sortedIndices.foreach(index => print(index + ", ")) - println() + + val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) + Sorting.quickSort(selectedIndices) + println(s"selected indices: ${selectedIndices.mkString(",")}") + // select function, select the top features order by lasso cofficients val select = udf { vector: Vector => - - val orginalValues: Array[Double] = vector.toArray vector match { // for DenseVector, just select top features - case v1: DenseVector => - val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until selectedIndices(0)) values(i) = 0 + for (k <- 0 until selectedIndices.size - 1) { + for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { + values(i) = 0 + } + } + for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 Vectors.dense(values) - case v2: SparseVector => - val nonZeroIndices = vector.asInstanceOf[SparseVector].indices.filter(_ < numTopFeatures) - val values: Array[Double] = sortedIndices.take(numTopFeatures).sorted map orginalValues - val nonZeroValues: Array[Double] = nonZeroIndices map values - Vectors.sparse(numTopFeatures, nonZeroIndices, nonZeroValues) - + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => selectedIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) case _ => throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + vector.getClass.getSimpleName + " is given.") } - } dataset.withColumn(outputCol, select(col(inputCol))) } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala index ff7e29d9f..650fa73e8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala @@ -22,25 +22,24 @@ import org.apache.spark.ml.classification.RandomForestClassifier import org.apache.spark.ml.{Estimator, Model} import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.Identifiable -import org.apache.spark.ml.linalg.{Vector, Vectors} +import org.apache.spark.ml.linalg.{Vector, Vectors, DenseVector, SparseVector} import org.apache.spark.sql.{DataFrame, Dataset} import org.apache.spark.sql.types.StructType import org.apache.spark.sql.functions._ import breeze.linalg.argsort -import breeze.linalg.DenseVector +import breeze.linalg.{DenseVector => BDV} +import scala.util.Sorting -class RandomForestSelectorWrapper { -} - -class RandomforestSelector(override val uid: String) extends Estimator[RandomforestSelectorModel]{ +class RandomForestSelector(override val uid: String) extends Estimator[RandomForestSelectorModel]{ var featuresCol: String = _ var outputCol: String = _ var labelCol: String = _ + var numTopFeatures: Int = _ - def this() = this(Identifiable.randomUID("randomforestSelector")) + def this() = this(Identifiable.randomUID("RandomForestSelector")) override def transformSchema(schema: StructType): StructType = { schema @@ -61,7 +60,12 @@ class RandomforestSelector(override val uid: String) extends Estimator[Randomfor this } - override def fit(dataset: Dataset[_]): RandomforestSelectorModel = { + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + + override def fit(dataset: Dataset[_]): RandomForestSelectorModel = { val rf = new RandomForestClassifier() .setFeaturesCol(featuresCol) @@ -71,22 +75,26 @@ class RandomforestSelector(override val uid: String) extends Estimator[Randomfor val featureImportances: Array[Double] = rfModel.featureImportances.toArray - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(featureImportances)).toArray.reverse + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(featureImportances)).toArray.reverse - new RandomforestSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + new RandomForestSelectorModel(uid, sortedIndices) + .setInputCol(featuresCol) + .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } - override def copy(extra: ParamMap): RandomforestSelector = { - new RandomforestSelector(uid) + override def copy(extra: ParamMap): RandomForestSelector = { + new RandomForestSelector(uid) .setFeaturesCol(featuresCol) .setOutputCol(outputCol) .setLabelCol(labelCol) + .setNumTopFeatures(numTopFeatures) } } -class RandomforestSelectorModel(override val uid: String, - val sortedIndices: Array[Int]) extends Model[RandomforestSelectorModel]{ +class RandomForestSelectorModel(override val uid: String, + val sortedIndices: Array[Int]) extends Model[RandomForestSelectorModel]{ var inputCol: String = _ @@ -112,21 +120,41 @@ class RandomforestSelectorModel(override val uid: String, override def transformSchema(schema: StructType): StructType = schema override def transform(dataset: Dataset[_]): DataFrame = { - sortedIndices.foreach(index => print(index + ", ")) - println() + + val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) + Sorting.quickSort(selectedIndices) + println(s"selected indices: ${selectedIndices.mkString(",")}") + // select function, select the top features order by feture importrances of random forest val select = udf { vector: Vector => - val orginalValues: Array[Double] = vector.toArray - val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues - Vectors.dense(values) + vector match { + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until selectedIndices(0)) values(i) = 0 + for (k <- 0 until selectedIndices.size - 1) { + for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { + values(i) = 0 + } + } + for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => selectedIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } } dataset.withColumn(outputCol, select(col(inputCol))) } - override def copy(extra: ParamMap): RandomforestSelectorModel = { - new RandomforestSelectorModel(uid, sortedIndices) + override def copy(extra: ParamMap): RandomForestSelectorModel = { + new RandomForestSelectorModel(uid, sortedIndices) .setNumTopFeatures(numTopFeatures) .setInputCol(inputCol) .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala index 079d63da4..8414113bb 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala @@ -18,8 +18,8 @@ package com.tencent.angel.spark.automl.feature.select -import breeze.linalg.{DenseVector, argsort} -import org.apache.spark.ml.linalg.{Vector, Vectors} +import breeze.linalg.{argsort, DenseVector => BDV} +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, Vectors} import org.apache.spark.ml.{Estimator, Model} import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.Identifiable @@ -31,10 +31,13 @@ import org.apache.spark.sql.functions.{col, udf} import org.apache.spark.sql.{DataFrame, Dataset, Row} import org.apache.spark.sql.types.StructType +import scala.util.Sorting + class VarianceSelector(override val uid: String) extends Estimator[VarianceSelectorModel] { var featuresCol: String = _ var outputCol: String = _ + var numTopFeatures: Int = _ def this() = this(Identifiable.randomUID("varianceSelector")) @@ -52,19 +55,30 @@ class VarianceSelector(override val uid: String) extends Estimator[VarianceSelec this } + def setNumTopFeatures(value: Int): this.type = { + numTopFeatures = value + this + } + override def fit(dataset: Dataset[_]): VarianceSelectorModel = { val featuresRDD: RDD[OldVector] = dataset.select(featuresCol).rdd.map{case Row(v: Vector) => OldVectors.dense(v.toArray) } val summary: MultivariateStatisticalSummary = Statistics.colStats(featuresRDD) val variance: Array[Double] = summary.mean.toArray - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(DenseVector(variance)).toArray.reverse + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(variance)).toArray.reverse - new VarianceSelectorModel(uid, sortedIndices).setInputCol(featuresCol).setOutputCol(outputCol) + new VarianceSelectorModel(uid, sortedIndices) + .setInputCol(featuresCol) + .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } override def copy(extra: ParamMap): Estimator[VarianceSelectorModel] = { - new VarianceSelector().setFeaturesCol(featuresCol).setOutputCol(outputCol) + new VarianceSelector() + .setFeaturesCol(featuresCol) + .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } } @@ -96,13 +110,32 @@ class VarianceSelectorModel(override val uid: String, override def transformSchema(schema: StructType): StructType = schema override def transform(dataset: Dataset[_]): DataFrame = { - sortedIndices.foreach(index => print(index + ", ")) - println() - // select function, select the top features order by lasso cofficients + val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) + Sorting.quickSort(selectedIndices) + println(s"selected indices: ${selectedIndices.mkString(",")}") + + // select function, select the top features order by lasso coefficients val select = udf { vector: Vector => - val orginalValues: Array[Double] = vector.toArray - val values: Array[Double] = sortedIndices.take(numTopFeatures) map orginalValues - Vectors.dense(values) + vector match { + // for DenseVector, just select top features + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until selectedIndices(0)) values(i) = 0 + for (k <- 0 until selectedIndices.size - 1) { + for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { + values(i) = 0 + } + } + for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => selectedIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } } dataset.withColumn(outputCol, select(col(inputCol))) } @@ -112,5 +145,6 @@ class VarianceSelectorModel(override val uid: String, .setNumTopFeatures(numTopFeatures) .setInputCol(inputCol) .setOutputCol(outputCol) + .setNumTopFeatures(numTopFeatures) } } diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala index 9d917c501..08be4a359 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala @@ -35,7 +35,7 @@ class Cartesian(override val uid: String) override protected def outputDataType: DataType = new VectorUDT() } -object Normalizer extends DefaultParamsReadable[Cartesian] { +object Cartesian extends DefaultParamsReadable[Cartesian] { @Since("1.6.0") override def load(path: String): Cartesian = super.load(path) diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala index d70a63b2b..5d870115f 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -1,7 +1,8 @@ package com.tencent.angel.spark.automl -import com.tencent.angel.spark.automl.feature.select.{LassoSelector, RandomforestSelector, VarianceSelector} +import com.tencent.angel.spark.automl.feature.select.{LassoSelector, LassoSelectorModel, RandomForestSelector, VarianceSelector} import org.apache.spark.sql.SparkSession +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.junit.Test class FeatureSelectorTest { @@ -11,27 +12,40 @@ class FeatureSelectorTest { @Test def testLasso(): Unit = { val data = spark.read.format("libsvm") .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") .persist() val splitData = data.randomSplit(Array(0.7, 0.3)) + val trainDF = splitData(0) + val testDF = splitData(1) + + val originalLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("features") + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") val selector = new LassoSelector() .setFeaturesCol("features") .setLabelCol("label") .setOutputCol("selectedFeatures") + .setNumTopFeatures(20) - val trainDF = splitData(0) - val testDF = splitData(1) + val selectedDF = selector.fit(data).transform(data) - val selectorModel = selector.fit(trainDF).setNumTopFeatures(50) + val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) + val selectedTrainDF = splitSelectedDF(0) + val selectedTestDF = splitSelectedDF(1) - val selectedTestDF = selectorModel.transform(testDF) + val selectedLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("selectedFeatures") - selectedTestDF.show() + val selectedAUC = selectedLR.fit(selectedTrainDF).evaluate(selectedTestDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"selected feature: auc = $selectedAUC") spark.stop() - } @Test @@ -39,24 +53,38 @@ class FeatureSelectorTest { val data = spark.read.format("libsvm") .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") .persist() val splitData = data.randomSplit(Array(0.7, 0.3)) + val trainDF = splitData(0) + val testDF = splitData(1) + + val originalLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("features") + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") - val selector = new RandomforestSelector() + val selector = new RandomForestSelector() .setFeaturesCol("features") .setLabelCol("label") .setOutputCol("selectedFeatures") + .setNumTopFeatures(20) - val trainDF = splitData(0) - val testDF = splitData(1) + val selectedDF = selector.fit(data).transform(data) - val selectorModel = selector.fit(trainDF).setNumTopFeatures(3) + val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) + val selectedTrainDF = splitSelectedDF(0) + val selectedTestDF = splitSelectedDF(1) - val selectedTestDF = selectorModel.transform(testDF) + val selectedLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("selectedFeatures") - selectedTestDF.show() + val selectedAUC = selectedLR.fit(selectedTrainDF).evaluate(selectedTestDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"selected feature: auc = $selectedAUC") spark.stop() } @@ -66,23 +94,37 @@ class FeatureSelectorTest { val data = spark.read.format("libsvm") .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") .persist() val splitData = data.randomSplit(Array(0.7, 0.3)) + val trainDF = splitData(0) + val testDF = splitData(1) + + val originalLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("features") + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") val selector = new VarianceSelector() .setFeaturesCol("features") .setOutputCol("selectedFeatures") + .setNumTopFeatures(20) - val trainDF = splitData(0) - val testDF = splitData(1) + val selectedDF = selector.fit(data).transform(data) - val selectorModel = selector.fit(trainDF).setNumTopFeatures(3) + val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) + val selectedTrainDF = splitSelectedDF(0) + val selectedTestDF = splitSelectedDF(1) - val selectedTestDF = selectorModel.transform(testDF) + val selectedLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("selectedFeatures") - selectedTestDF.show() + val selectedAUC = selectedLR.fit(selectedTrainDF).evaluate(selectedTestDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"selected feature: auc = $selectedAUC") spark.stop() } From 26272f4bc931f692385c09f8e79eec53d3eaea73 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 12:00:02 +0800 Subject: [PATCH 085/115] self cartesian --- .../feature/examples/FilterNonZero.scala | 4 +- .../feature/examples/TwoOrderCross.scala | 6 +- .../{Cartesian.scala => SelfCartesian.scala} | 11 +- .../ml/feature/operator/VectorCartesian.scala | 190 ++++++++++++++++++ 4 files changed, 200 insertions(+), 11 deletions(-) rename spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/{Cartesian.scala => SelfCartesian.scala} (79%) create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala index bf6b2c0c0..b9619a191 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala @@ -20,7 +20,7 @@ package com.tencent.angel.spark.automl.feature.examples import com.tencent.angel.spark.automl.feature.FeatureUtils import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.feature.operator.{Cartesian, VectorFilterZero} +import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorFilterZero} import org.apache.spark.sql.SparkSession object FilterNonZero { @@ -43,7 +43,7 @@ object FilterNonZero { val featureMap: Map[Int, Int] = Map[Int, Int]() - val cartesian = new Cartesian() + val cartesian = new SelfCartesian() .setInputCol("features") .setOutputCol("cartesian_features") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala index 3d428d570..9107941a3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala @@ -23,7 +23,7 @@ import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} -import org.apache.spark.ml.feature.operator.{Cartesian, VectorFilterZero} +import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorFilterZero} import org.apache.spark.sql.SparkSession object TwoOrderCross { @@ -50,7 +50,7 @@ object TwoOrderCross { var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) - val cartesian_1 = new Cartesian() + val cartesian_1 = new SelfCartesian() .setInputCol("features") .setOutputCol("cartesian_features_1") @@ -70,7 +70,7 @@ object TwoOrderCross { .setInputCols(Array("features", "filter_features_1")) .setOutputCol("assemble_features_1") - val cartesian_2 = new Cartesian() + val cartesian_2 = new SelfCartesian() .setInputCol("assemble_features_1") .setOutputCol("cartesian_features_2") diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/SelfCartesian.scala similarity index 79% rename from spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala rename to spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/SelfCartesian.scala index 08be4a359..884811e40 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/Cartesian.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/SelfCartesian.scala @@ -24,19 +24,18 @@ import org.apache.spark.ml.UnaryTransformer import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} import org.apache.spark.sql.types.DataType -class Cartesian(override val uid: String) - extends UnaryTransformer[Vector, Vector, Cartesian] with DefaultParamsWritable { +class SelfCartesian(override val uid: String) + extends UnaryTransformer[Vector, Vector, SelfCartesian] with DefaultParamsWritable { - @Since("1.4.0") - def this() = this(Identifiable.randomUID("cartesian_product")) + def this() = this(Identifiable.randomUID("SelfCartesian")) override protected def createTransformFunc: Vector => Vector = FeatureCrossOp.flatCartesian override protected def outputDataType: DataType = new VectorUDT() } -object Cartesian extends DefaultParamsReadable[Cartesian] { +object SelfCartesian extends DefaultParamsReadable[SelfCartesian] { @Since("1.6.0") - override def load(path: String): Cartesian = super.load(path) + override def load(path: String): SelfCartesian = super.load(path) } diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala new file mode 100644 index 000000000..4e72fe0b6 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala @@ -0,0 +1,190 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package org.apache.spark.ml.feature.operator + +import org.apache.spark.SparkException +import org.apache.spark.annotation.Since +import org.apache.spark.ml.Transformer +import org.apache.spark.ml.attribute._ +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.ml.param.ParamMap +import org.apache.spark.ml.param.shared.{HasInputCols, HasOutputCol} +import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} +import org.apache.spark.sql.{DataFrame, Dataset, Row} +import org.apache.spark.sql.functions.{col, struct, udf} +import org.apache.spark.sql.types._ +import org.apache.spark.ml.linalg.SQLDataTypes.VectorType + +import scala.collection.mutable.ArrayBuilder + +class VectorCartesian (override val uid: String) extends Transformer + with HasInputCols with HasOutputCol with DefaultParamsWritable { + + def this() = this(Identifiable.randomUID("VectorCartesian")) + + /** @group setParam */ + def setInputCols(values: Array[String]): this.type = set(inputCols, values) + + /** @group setParam */ + def setOutputCol(value: String): this.type = set(outputCol, value) + + // optimistic schema; does not contain any ML attributes + override def transformSchema(schema: StructType): StructType = { + require(get(inputCols).isDefined, "Input cols must be defined first.") + require(get(outputCol).isDefined, "Output col must be defined first.") + require($(inputCols).length > 0, "Input cols must have non-zero length.") + require($(inputCols).map(c => schema(c).dataType).forall(_.sameType(VectorType)), + "Input cols must be vectors.") + StructType(schema.fields :+ StructField($(outputCol), new VectorUDT, false)) + } + + override def transform(dataset: Dataset[_]): DataFrame = { + transformSchema(dataset.schema, logging = true) + val inputFeatures = $(inputCols).map(c => dataset.schema(c)) + val vectorDims = getVectorDimension(dataset, ${inputCols}) + val featureAttrs = getFeatureAttrs(inputFeatures) + + def interactFunc = udf { row: Row => + var indices = ArrayBuilder.make[Int] + var values = ArrayBuilder.make[Double] + var size = 1 + indices += 0 + values += 1.0 + var featureIndex = row.length - 1 + while (featureIndex >= 0) { + val prevIndices = indices.result() + val prevValues = values.result() + val prevSize = size + indices = ArrayBuilder.make[Int] + values = ArrayBuilder.make[Double] + size *= vectorDims(featureIndex) + processNonzeroOutput(row(featureIndex), (i, a) => { + var j = 0 + while (j < prevIndices.length) { + indices += prevIndices(j) + i * prevSize + values += prevValues(j) * a + j += 1 + } + }) + featureIndex -= 1 + } + Vectors.sparse(size, indices.result(), values.result()).compressed + } + + val featureCols = inputFeatures.map { f => dataset(f.name) } + + dataset.select( + col("*"), + interactFunc(struct(featureCols: _*)).as($(outputCol), featureAttrs.toMetadata())) + } + + private def getVectorDimension(dataset: Dataset[_], cols: Array[String]): Array[Int] = { + cols.map{ colName => + dataset.select(colName).first() match { + case Row(v: Vector) => v.size + case _ => throw new SparkException(s"col $colName should be Vector") + } + } + } + + /** + * Given an input row of features, invokes the specific function for every non-zero output. + * + * @param value The row value to encode, either a Double or Vector. + * @param f The callback to invoke on each non-zero (index, value) output pair. + */ + def processNonzeroOutput(value: Any, f: (Int, Double) => Unit): Unit = value match { + case vec: Vector => + vec.foreachActive { (i, v) => + f(i, v) + } + case null => + throw new SparkException("Vectors cannot be null.") + case o => + throw new SparkException(s"$o of type ${o.getClass.getName} is not supported.") + } + + /** + * Generates ML attributes for the output vector of all feature interactions. We make a best + * effort to generate reasonable names for output features, based on the concatenation of the + * interacting feature names and values delimited with `_`. When no feature name is specified, + * we fall back to using the feature index (e.g. `foo:bar_2_0` may indicate an interaction + * between the numeric `foo` feature and a nominal third feature from column `bar`. + * + * @param features The input feature columns to the Interaction transformer. + */ + private def getFeatureAttrs(features: Seq[StructField]): AttributeGroup = { + var featureAttrs: Seq[Attribute] = Nil + features.reverse.foreach { f => + val encodedAttrs = f.dataType match { + case _: VectorUDT => + val group = AttributeGroup.fromStructField(f) + encodedFeatureAttrs( + group.attributes.getOrElse(new Array[Attribute](0)), Some(group.name)) + case _ => + throw new SparkException(s"Col ${f.name} must be Vector.") + } + if (featureAttrs.isEmpty) { + featureAttrs = encodedAttrs + } else { + featureAttrs = encodedAttrs.flatMap { head => + featureAttrs.map { tail => + NumericAttribute.defaultAttr.withName(head.name.get + ":" + tail.name.get) + } + } + } + } + new AttributeGroup($(outputCol), featureAttrs.toArray) + } + + /** + * Generates the output ML attributes for a single input feature. Each output feature name has + * up to three parts: the group name, feature name, and category name (for nominal features), + * each separated by an underscore. + * + * @param inputAttrs The attributes of the input feature. + * @param groupName Optional name of the input feature group (for Vector type features). + */ + private def encodedFeatureAttrs( + inputAttrs: Array[Attribute], + groupName: Option[String]): Seq[Attribute] = { + + def format( + index: Int, + attrName: Option[String], + categoryName: Option[String]): String = { + val parts = Seq(groupName, Some(attrName.getOrElse(index.toString)), categoryName) + parts.flatten.mkString("_") + } + + inputAttrs.zipWithIndex.flatMap { + case (a: Attribute, i) => + Seq(NumericAttribute.defaultAttr.withName(format(i, a.name, None))) + } + } + + override def copy(extra: ParamMap): VectorCartesian = defaultCopy(extra) + +} + +@Since("1.6.0") +object VectorCartesian extends DefaultParamsReadable[VectorCartesian] { + + @Since("1.6.0") + override def load(path: String): VectorCartesian = super.load(path) +} From 73853afa0b833110a17f060b37c621644b6e9ab4 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 12:00:26 +0800 Subject: [PATCH 086/115] add ut test --- .../feature/examples/LassoSelector.scala | 60 ------- .../feature/examples/OneOrderCross.scala | 118 -------------- .../angel/spark/automl/FeatureCrossTest.scala | 147 ++++++++++++++++++ .../spark/automl/FeatureSelectorTest.scala | 6 +- 4 files changed, 150 insertions(+), 181 deletions(-) delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala deleted file mode 100644 index f6b35de53..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/LassoSelector.scala +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - -package com.tencent.angel.spark.automl.feature.examples - -import org.apache.spark.ml.classification.LogisticRegression -import org.apache.spark.ml.feature.operator.Cartesian -import org.apache.spark.sql.SparkSession - -object LassoSelector { - - def main(args: Array[String]): Unit = { - - val spark = SparkSession.builder().master("local").getOrCreate() - - val data = spark.read.format("libsvm") - .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") - .persist() - - val splitData = data.randomSplit(Array(0.7, 0.3)) - - val trainDF = splitData(0) - val testDF = splitData(1) - - val cartesianOp = new Cartesian() - .setInputCol("features") - .setOutputCol("cartesian_features") - - val crossDF = cartesianOp.transform(trainDF) - - val lr = new LogisticRegression() - .setFeaturesCol("cartesian_features") - .setLabelCol("label") - .setElasticNetParam(1.0) - .setMaxIter(10) - - val lrModel = lr.fit(crossDF) - lrModel.evaluate(testDF) - - println(s"nonzero items in weight vector:") - println(lrModel.coefficients.toDense.values.zipWithIndex - .filter { case (v: Double, i: Int) => math.abs(v) > 1e-10 }.take(100).mkString(",")) - } - -} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala deleted file mode 100644 index a45757f8a..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/OneOrderCross.scala +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - -package com.tencent.angel.spark.automl.feature.examples - -import com.tencent.angel.spark.automl.feature.FeatureUtils -import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} -import org.apache.spark.ml.feature.operator.Cartesian -import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} -import org.apache.spark.sql.SparkSession - -object OneOrderCross { - - def main(args: Array[String]): Unit = { - - val spark = SparkSession.builder().master("local").getOrCreate() - - val data = spark.read.format("libsvm") - .option("numFeatures", "123") - .load("data/a9a/a9a_123d_train_trans.libsvm") - .persist() - - val maxDim = FeatureUtils.maxDim(data) - println(s"max dimension: $maxDim") - - // feature cross meta - var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() - (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) - - val cartesianOp = new Cartesian() - .setInputCol("features") - .setOutputCol("cartesian_features") - - //val crossDF = cartesianOp.transform(trainDF).persist() - - val selector = new ChiSqSelector() - .setNumTopFeatures(maxDim * maxDim / 2) - .setFeaturesCol("cartesian_features") - .setLabelCol("label") - .setOutputCol("selected_features") - - val allAssembler = new VectorAssembler() - .setInputCols(Array("features", "cartesian_features")) - .setOutputCol("assemble_features") - - val selectedAssembler = new VectorAssembler() - .setInputCols(Array("features", "selected_features")) - .setOutputCol("assemble_features_selected") - - val pipeline = new Pipeline() - .setStages(Array(cartesianOp, selector, allAssembler, selectedAssembler)) - - val featureModel = pipeline.fit(data) - val crossDF = featureModel.transform(data) - - println(crossDF.schema) - crossDF.show(1) - - val splitData = crossDF.randomSplit(Array(0.7, 0.3)) - - val trainDF = splitData(0).persist() - val testDF = splitData(1).persist() - - // original features - val lr_orig = new LogisticRegression() - .setFeaturesCol("features") - .setMaxIter(10) - .setRegParam(0.01) - val auc_orig = lr_orig.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"original feature: auc = $auc_orig") - - // original features - val lr_cross = new LogisticRegression() - .setFeaturesCol("cartesian_features") - .setMaxIter(10) - .setRegParam(0.01) - val auc_cross = lr_cross.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"cross feature: auc = $auc_cross") - - // original features + all cross features - val lr_orig_cross = new LogisticRegression() - .setFeaturesCol("assemble_features") - .setLabelCol("label") - .setMaxIter(10) - .setRegParam(0.01) - val auc_orig_cross = lr_orig_cross.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"original feature + cross feature: auc = $auc_orig_cross") - - // original features + selected cross features - val lr_orig_cross_select = new LogisticRegression() - .setFeaturesCol("assemble_features_selected") - .setLabelCol("label") - .setMaxIter(10) - .setRegParam(0.01) - val auc_orig_cross_select = lr_orig_cross_select.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"original feature + selected cross feature: auc = $auc_orig_cross_select") - - - spark.close() - } - -} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala new file mode 100644 index 000000000..6422ae99c --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala @@ -0,0 +1,147 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute} +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.{Interaction, VectorAssembler} +import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorCartesian} +import org.apache.spark.ml.linalg.Vectors +import org.apache.spark.sql.{Row, SparkSession} +import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.ml.linalg.SQLDataTypes.VectorType +import org.junit.Test + +class FeatureCrossTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test def testInteraction(): Unit = { + val data = Seq( + Row(Vectors.dense(Array(1.0,2.0,3.0)), Vectors.dense(Array(2.0,3.0,4.0)), Vectors.dense(Array(3.0,4.0,5.0))) + ) + + val defaultAttr = NumericAttribute.defaultAttr + val attrs = Array("f1", "f2", "f3").map(defaultAttr.withName) + val attrGroup1 = new AttributeGroup("vec1", attrs.asInstanceOf[Array[Attribute]]) + val attrGroup2 = new AttributeGroup("vec2", attrs.asInstanceOf[Array[Attribute]]) + val attrGroup3 = new AttributeGroup("vec3", attrs.asInstanceOf[Array[Attribute]]) + + val schema = Seq( + StructField("vec1", VectorType, true, attrGroup1.toMetadata), + StructField("vec2", VectorType, true, attrGroup2.toMetadata), + StructField("vec3", VectorType, true, attrGroup3.toMetadata) + ) + + val df = spark.createDataFrame( + spark.sparkContext.parallelize(data), + StructType(schema) + ) + + val interaction = new Interaction() + .setInputCols(Array("vec1", "vec2", "vec3")) + .setOutputCol("interactedCol") + + val interacted = interaction.transform(df) + + interacted.show(truncate = false) + } + + @Test def testVectorCartesian(): Unit = { + val spark = SparkSession.builder().master("local").getOrCreate() + + val data = Seq( + Row(Vectors.dense(Array(1.0,2.0,3.0)), Vectors.dense(Array(2.0,3.0,4.0)), Vectors.dense(Array(3.0,4.0,5.0))) + ) + + val schema = Seq( + StructField("vec1", VectorType, true), + StructField("vec2", VectorType, true), + StructField("vec3", VectorType, true) + ) + + val df = spark.createDataFrame( + spark.sparkContext.parallelize(data), + StructType(schema) + ) + + val vectorCartesian = new VectorCartesian() + .setInputCols(Array("vec1", "vec1")) + .setOutputCol("vec1_vec1") + + val interacted = vectorCartesian.transform(df) + + interacted.show(truncate = false) + } + + @Test def testSelfCartesian(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val cartesian = new SelfCartesian() + .setInputCol("features") + .setOutputCol("cartesian_features") + + val assembler = new VectorAssembler() + .setInputCols(Array("features", "cartesian_features")) + .setOutputCol("assemble_features") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, assembler)) + + val featureModel = pipeline.fit(data) + val crossDF = featureModel.transform(data) + crossDF.show(1) + + val splitData = crossDF.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitData(0).persist() + val testDF = splitData(1).persist() + + // original features + val originalLR = new LogisticRegression() + .setFeaturesCol("features") + .setMaxIter(10) + .setRegParam(0.01) + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") + + // cartesian features + val cartesianLR = new LogisticRegression() + .setFeaturesCol("cartesian_features") + .setMaxIter(10) + .setRegParam(0.01) + val cartesianAUC = cartesianLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"cartesian feature: auc = $cartesianAUC") + + // original features + cartesian features + val assemblerLR = new LogisticRegression() + .setFeaturesCol("assemble_features") + .setLabelCol("label") + .setMaxIter(10) + .setRegParam(0.01) + val assemblerAUC = assemblerLR.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature + cartesian feature: auc = $assemblerAUC") + + spark.close() + } + +} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala index 5d870115f..61c76b02a 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -30,7 +30,7 @@ class FeatureSelectorTest { .setFeaturesCol("features") .setLabelCol("label") .setOutputCol("selectedFeatures") - .setNumTopFeatures(20) + .setNumTopFeatures(50) val selectedDF = selector.fit(data).transform(data) @@ -71,7 +71,7 @@ class FeatureSelectorTest { .setFeaturesCol("features") .setLabelCol("label") .setOutputCol("selectedFeatures") - .setNumTopFeatures(20) + .setNumTopFeatures(50) val selectedDF = selector.fit(data).transform(data) @@ -111,7 +111,7 @@ class FeatureSelectorTest { val selector = new VarianceSelector() .setFeaturesCol("features") .setOutputCol("selectedFeatures") - .setNumTopFeatures(20) + .setNumTopFeatures(50) val selectedDF = selector.fit(data).transform(data) From 33b43d0a9255e77e2b89d0b24e9eaff4425c4e22 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 12:01:46 +0800 Subject: [PATCH 087/115] fix empty config bugs random sample may produce configs already sampled before, and return empty config --- .../spark/automl/tuner/GPTunerExample.scala | 4 +- .../spark/automl/tuner/GridTunerExample.scala | 1 + .../spark/automl/tuner/RFTunerExample.scala | 39 ++++---- .../automl/tuner/RandomTunerExample.scala | 17 ++-- .../tuner/config/ConfigurationSpace.scala | 77 +++++++++++---- .../automl/tuner/kernel/CovarianceType.scala | 7 +- .../spark/automl/tuner/model/GPModel.scala | 4 +- .../tuner/parameter/ContinuousSpace.scala | 11 ++- .../tuner/parameter/DiscreteSpace.scala | 14 +-- .../automl/tuner/parameter/ParamSpace.scala | 1 + .../spark/automl/tuner/solver/Solver.scala | 95 ++++++++----------- .../tuner/surrogate/SurrogateMode.scala | 33 +++++++ 12 files changed, 178 insertions(+), 125 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/SurrogateMode.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala index 218268329..afc0863a5 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala @@ -32,9 +32,9 @@ object GPTunerExample extends App { val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "GP") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "GaussianProcess") val trail: Trail = new TestTrail() - (0 until 25).foreach { iter => + (0 until 100).foreach { iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index 54aed919a..c7ea1f6c1 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -34,6 +34,7 @@ object GridTunerExample extends App { val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") val trail: Trail = new TestTrail() val configs: Array[Configuration] = solver.suggest() + println(s"grid size: ${configs.size}") val results: Array[Double] = trail.evaluate(configs) solver.feed(configs, results) val result: (Vector, Double) = solver.optimal diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala index e8447b012..5f5ba4ac4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala @@ -18,35 +18,30 @@ package com.tencent.angel.spark.automl.tuner -import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} -import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} -import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace -import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.automl.tuner.surrogate.{RFSurrogate, Surrogate} + +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector object RFTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - cs.addParam(param1) - cs.addParam(param2) - cs.addParam(param3) - cs.addParam(param4) - val sur: Surrogate = new RFSurrogate(cs, true) - val acq: Acquisition = new EI(sur, 0.1f) - val opt: AcqOptimizer = new RandomSearch(acq, cs) - val solver: Solver = new Solver(cs, sur, acq, opt) + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, "RandomForest") val trail: Trail = new TestTrail() - val runner: SolverWithTrail = new SolverWithTrail(solver, trail) - val result: (Vector, Double) = runner.run(10) - sur.stop() + (0 until 25).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.optimal + solver.stop println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index ed986a983..40666cd91 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -27,18 +27,13 @@ import org.apache.spark.ml.linalg.Vector object RandomTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) - val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - cs.addParam(param1) - cs.addParam(param2) - cs.addParam(param3) - cs.addParam(param4) - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Random") +// val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) +// val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) + val param3 = ParamSpace.fromConfigString("param3", "{2.0,3.0,4.0,5.0,6.0}") + val param4 = ParamSpace.fromConfigString("param4", "{3:10:1}") + val solver: Solver = Solver(Array(param3, param4), true, surrogate = "Random") val trail: Trail = new TestTrail() - (0 until 25).foreach { iter => + (0 until 100).foreach { iter => println(s"------iteration $iter starts------") val configs: Array[Configuration] = solver.suggest() val results: Array[Double] = trail.evaluate(configs) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 18319ee8b..bae85117a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -78,14 +78,27 @@ class ConfigurationSpace( def addHistory(vec: Vector): Unit = preX += vec + def spaceSize(): Int = { + var size: Int = if (numParams > 0) 1 else 0 + var hasInfinite = false + getParams().foreach{ param => + param.numValues match { + case Int.MaxValue => hasInfinite = true + case _ => size *= param.numValues + } + } + if (hasInfinite) Int.MaxValue else size + } + def sample(size: Int): Array[Configuration] = { var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var missing: Int = 0 - var isEmpty: Boolean = false + val left = if (spaceSize() == Int.MaxValue) Int.MaxValue else spaceSize - preX.size + val trueSize = left min size + println(s"configuration space size ${spaceSize()}, remaining $left, sample $trueSize") do { - missing = size - configs.length - //println(s"num of params: $numParams") + missing = trueSize - configs.length val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) param2Idx.foreach { case (paramName, paramIdx) => paramDict.get(paramName) match { @@ -97,32 +110,43 @@ class ConfigurationSpace( } } val validVectors = vectors.filter(isValid) - // check is there is no valid config - if (validVectors.isEmpty) { - isEmpty = true - } else { - validVectors.foreach { vec => - configs += new Configuration(param2Idx, param2Doc, vec) - } + validVectors.foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) } - } while (configs.length < size && !isEmpty) + } while (configs.length < trueSize) configs.toArray } - def asDouble(num: AnyVal): Double = { - num match { - case i: Int => i.toDouble - case i: Long => i.toLong - case i: Float => i.toDouble - case i: Double => i - case _ => throw new AutoMLException(s"type ${num.getClass} is not supported") - } - } + def randomSample(size: Int): Array[Configuration] = { + var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] - def isValid(vec: Vector): Boolean = !preX.contains(vec) + var missing: Int = 0 + val left = if (spaceSize() == Int.MaxValue) Int.MaxValue else spaceSize - preX.size + val trueSize = left min size + println(s"configuration space size ${spaceSize()}, remaining $left, sample $trueSize") + do { + missing = trueSize - configs.length + val vectors: Array[Vector] = Array.fill(missing)(Vectors.dense(new Array[Double](numParams))) + param2Idx.foreach { case (paramName, paramIdx) => + paramDict.get(paramName) match { + case Some(param) => + param.sample(missing).map(asDouble).zipWithIndex.foreach { case (f: Double, i: Int) => + vectors(i).toArray(paramIdx) = f + } + case None => LOG.info(s"Cannot find $paramName.") + } + } + val validVectors = vectors.filter(isValid) + validVectors.foreach { vec => + configs += new Configuration(param2Idx, param2Doc, vec) + } + } while (configs.length < trueSize) + configs.toArray + } def gridSample(): Array[Configuration] = { + println(s"configuration space size ${spaceSize()}") var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] @@ -175,6 +199,17 @@ class ConfigurationSpace( } configs.toArray } + } + def asDouble(num: AnyVal): Double = { + num match { + case i: Int => i.toDouble + case i: Long => i.toLong + case i: Float => i.toDouble + case i: Double => i + case _ => throw new AutoMLException(s"type ${num.getClass} is not supported") + } } + + def isValid(vec: Vector): Boolean = !preX.contains(vec) } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala index 190fe3d17..46d36ade8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/kernel/CovarianceType.scala @@ -27,17 +27,16 @@ object CovarianceType extends Enumeration { val MATERN5_ISO = Value("MATERN5_ISO") val SQUAREEXP_ISO = Value("SQUAREEXP_ISO") - def parse(name: String): Covariance = { + def fromString(name: String): Covariance = { val covType = CovarianceType.withName(name.toUpperCase()) - parse(covType) + fromString(covType) } - def parse(covType: CovarianceType.Value): Covariance = covType match { + def fromString(covType: CovarianceType.Value): Covariance = covType match { case MATERN3 => new Matern3 case MATERN5 => new Matern5 case MATERN5_ISO => new Matern5Iso case SQUAREEXP_ISO => new SquareExpIso case _ => new Matern5 } - } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 8790f6af8..57ce64595 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -129,13 +129,13 @@ object GPModel { covParams: BDV[Double], noiseStdDev: Double, meanFunc: (BDM[Double]) => BDV[Double]): GPModel = { - new GPModel(CovarianceType.parse(covName), covParams, noiseStdDev, meanFunc) + new GPModel(CovarianceType.fromString(covName), covParams, noiseStdDev, meanFunc) } def apply(covType: CovarianceType.Value, covParams: BDV[Double], noiseStdDev: Double, meanFunc: (BDM[Double]) => BDV[Double]): GPModel = { - new GPModel(CovarianceType.parse(covType), covParams, noiseStdDev, meanFunc) + new GPModel(CovarianceType.fromString(covType), covParams, noiseStdDev, meanFunc) } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 0a5ac4a78..2952394aa 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -51,7 +51,7 @@ class ContinuousSpace( } def this(name: String, config: String) = { - this(name, 0, 1, -1, seed = 100) + this(name, 0, 1, -1) val items = parseConfig(config) lower = items._1 upper = items._2 @@ -121,7 +121,7 @@ class ContinuousSpace( def getValues: Array[Double] = gridValues - def numValues: Int = num + def numValues: Int = if (isGrid) gridValues.length else Int.MaxValue def toGridSearch: ParamSpace[Double] = this @@ -144,4 +144,11 @@ object ContinuousSpace { def apply(name: String, config: String) = { new ContinuousSpace(name, config) } + + def main(args: Array[String]): Unit = { + val seed: Int = 100 + val rd = new Random(seed) + println((0 until 100).map(_ => rd.nextInt(100)).mkString(",")) + println((0 until 100).map(_ => rd.nextInt(100)).mkString(",")) + } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index fc445deee..0c1d8db09 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -33,24 +33,24 @@ class DiscreteSpace[T <: AnyVal : ClassTag]( override val name: String, var values: Array[T], override val doc: String = "discrete param", - var seed: Int = 100) extends ParamSpace[T](name, doc) { + var seed: Int = 101) extends ParamSpace[T](name, doc) { private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" def this(name: String, config: String, doc: String) = { - this(name, Array.empty[T], doc, seed = 100) + this(name, Array.empty[T], doc, seed = 101) this.values = parseConfig(config) } + def this(name: String, config: String) = { + this(name, config, "discrete param") + } + def this(name: String, config: String, doc: String, seed: Int) = { this(name, Array.empty[T], doc, seed = seed) this.values = parseConfig(config) } - def this(name: String, config: String) = { - this(name, config, "discrete param", seed = 100) - } - def this(name: String, config: String, seed: Int) = { this(name, config, "discrete param", seed = seed) } @@ -132,7 +132,7 @@ object DiscreteSpace { } def main(args: Array[String]): Unit = { - val obj = new DiscreteSpace[Int]("test", "1:10:1", seed = 10) + val obj = new DiscreteSpace[Int]("test", "1:10:1") println(obj.toString) println(obj.getValues(1)) println(obj.sample(2).toString()) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index 3023037e9..773d73125 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -37,6 +37,7 @@ abstract class ParamSpace[+T: ClassTag](val name: String, def getValues: Array[Double] + def numValues: Int } object ParamSpace { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index ece76f74d..df1b900e9 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -23,7 +23,7 @@ import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} import com.tencent.angel.spark.automl.tuner.acquisition.optimizer.{AcqOptimizer, RandomSearch} import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.surrogate.{GPSurrogate, NormalSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.surrogate._ import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} @@ -33,14 +33,12 @@ class Solver( val surrogate: Surrogate, val acqFuc: Acquisition, val optimizer: AcqOptimizer, - val train: Boolean = true, - val grid: Boolean = false) { + val surrogateMode: SurrogateMode.Value) { val LOG: Log = LogFactory.getLog(classOf[Solver]) val PARAM_TYPES: Array[String] = Array("discrete", "continuous") - def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate @@ -72,16 +70,19 @@ class Solver( * Suggests configurations to evaluate. */ def suggest(): Array[Configuration] = { - if (train) { - val acqAndConfig = optimizer.maximize(TunerParam.batchSize) - println(s"suggest configurations:") - acqAndConfig.foreach { case (acq, config) => - println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + - s"acquisition[$acq]") - } - acqAndConfig.map(_._2) - } else { - if (grid) cs.gridSample() else cs.sample(TunerParam.sampleSize) + surrogateMode match { + case SurrogateMode.GP | SurrogateMode.RF => + val acqAndConfig = optimizer.maximize(TunerParam.batchSize) + println(s"suggest configurations:") + acqAndConfig.foreach { case (acq, config) => + println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + + s"acquisition[$acq]") + } + acqAndConfig.map(_._2) + case SurrogateMode.RANDOM => + cs.randomSample(TunerParam.batchSize) + case SurrogateMode.GRID => + cs.gridSample() } } @@ -121,60 +122,46 @@ class Solver( object Solver { def apply(cs: ConfigurationSpace, surrogate: Surrogate, acqFuc: Acquisition, optimizer: AcqOptimizer): Solver = { - new Solver(cs, surrogate, acqFuc, optimizer) + new Solver(cs, surrogate, acqFuc, optimizer, SurrogateMode.GP) } def apply(cs: ConfigurationSpace): Solver = { val sur: Surrogate = new GPSurrogate(cs, minimize = true) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) - new Solver(cs, sur, acq, opt) + new Solver(cs, sur, acq, opt, SurrogateMode.GP) } def apply(cs: ConfigurationSpace, minimize: Boolean = true, surrogate: String): Solver = { - var sur: Surrogate = new GPSurrogate(cs, minimize) - var acq: Acquisition = new EI(sur, 0.1f) - var opt: AcqOptimizer = new RandomSearch(acq, cs) - var train: Boolean = true - var grid: Boolean = false - if (surrogate == "Grid") { - sur = new NormalSurrogate(cs, minimize) - acq = new EI(sur, 0.1f) - opt = new RandomSearch(acq, cs) - train = false - grid = true - } else if (surrogate == "Random") { - sur = new NormalSurrogate(cs, minimize) - acq = new EI(sur, 0.1f) - opt = new RandomSearch(acq, cs) - train = false - grid = false + val mode = SurrogateMode.fromString(surrogate) + mode match { + case SurrogateMode.GP => + val sur: Surrogate = new GPSurrogate(cs, minimize) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt, mode) + case SurrogateMode.GP => + val sur: Surrogate = new RFSurrogate(cs, minimize) + val acq: Acquisition = new EI(sur, 0.1f) + val opt: AcqOptimizer = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt, mode) + case SurrogateMode.RANDOM => + val sur = new NormalSurrogate(cs, minimize) + val acq = new EI(sur, 0.1f) + val opt = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt, mode) + case SurrogateMode.GRID => + val sur = new NormalSurrogate(cs, minimize) + val acq = new EI(sur, 0.1f) + val opt = new RandomSearch(acq, cs) + new Solver(cs, sur, acq, opt, mode) } - new Solver(cs, sur, acq, opt, train, grid) } def apply[T <: AnyVal](array: Array[ParamSpace[T]], minimize: Boolean, surrogate: String): Solver = { val cs: ConfigurationSpace = new ConfigurationSpace("cs") array.foreach(cs.addParam) - var sur: Surrogate = new GPSurrogate(cs, minimize) - var acq: Acquisition = new EI(sur, 0.1f) - var opt: AcqOptimizer = new RandomSearch(acq, cs) - var train: Boolean = true - var grid: Boolean = false - if (surrogate == "Grid") { - sur = new NormalSurrogate(cs, minimize) - acq = new EI(sur, 0.1f) - opt = new RandomSearch(acq, cs) - train = false - grid = true - } else if (surrogate == "Random") { - sur = new NormalSurrogate(cs, minimize) - acq = new EI(sur, 0.1f) - opt = new RandomSearch(acq, cs) - train = false - grid = false - } - new Solver(cs, sur, acq, opt, train, grid) + Solver(cs, minimize, surrogate) } def apply(minimize: Boolean): Solver = { @@ -182,7 +169,7 @@ object Solver { val sur: Surrogate = new GPSurrogate(cs, minimize) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) - new Solver(cs, sur, acq, opt) + new Solver(cs, sur, acq, opt, SurrogateMode.GP) } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/SurrogateMode.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/SurrogateMode.scala new file mode 100644 index 000000000..b4c0c517d --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/SurrogateMode.scala @@ -0,0 +1,33 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.tuner.surrogate + + +object SurrogateMode extends Enumeration { + + type SurrogateMode = Value + + val GP = Value("GaussianProcess") + val RF = Value("RandomForest") + val RANDOM = Value("Random") + val GRID = Value("Grid") + + def fromString(mode: String): SurrogateMode = { + SurrogateMode.withName(mode) + } +} From 5abf6c530a5347bc2a462dd772f26ea007b90d29 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 12:06:47 +0800 Subject: [PATCH 088/115] add ut test of tuner --- .../automl/tuner/RandomTunerExample.scala | 8 +- .../angel/spark/automl/TunerTest.scala | 79 +++++++++++++++++++ 2 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala index 40666cd91..cb0dbcff2 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala @@ -27,11 +27,9 @@ import org.apache.spark.ml.linalg.Vector object RandomTunerExample extends App { override def main(args: Array[String]): Unit = { -// val param1: ParamSpace[Double] = new ContinuousSpace("param1", 0, 10, 11) -// val param2: ParamSpace[Double] = new ContinuousSpace("param2", -5, 5, 11) - val param3 = ParamSpace.fromConfigString("param3", "{2.0,3.0,4.0,5.0,6.0}") - val param4 = ParamSpace.fromConfigString("param4", "{3:10:1}") - val solver: Solver = Solver(Array(param3, param4), true, surrogate = "Random") + val param1 = ParamSpace.fromConfigString("param3", "{2.0,3.0,4.0,5.0,6.0}") + val param2 = ParamSpace.fromConfigString("param4", "{3:10:1}") + val solver: Solver = Solver(Array(param1, param2), true, surrogate = "Random") val trail: Trail = new TestTrail() (0 until 100).foreach { iter => println(s"------iteration $iter starts------") diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala new file mode 100644 index 000000000..46f3e5207 --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala @@ -0,0 +1,79 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import com.tencent.angel.spark.automl.tuner.config.Configuration +import com.tencent.angel.spark.automl.tuner.parameter.{DiscreteSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} +import org.apache.spark.ml.linalg.Vector +import org.junit.Test + +class TunerTest { + + @Test def testRandom(): Unit = { + val param1 = ParamSpace.fromConfigString("param3", "{2.0,3.0,4.0,5.0,6.0}") + val param2 = ParamSpace.fromConfigString("param4", "{3:10:1}") + val solver: Solver = Solver(Array(param1, param2), true, surrogate = "Random") + val trail: Trail = new TestTrail() + (0 until 100).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest() + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } + + @Test def testGrid(): Unit = { + val param1 = ParamSpace.fromConfigString("param1", "[1:10:10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) + val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") + val trail: Trail = new TestTrail() + val configs: Array[Configuration] = solver.suggest() + println(s"grid size: ${configs.size}") + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } + + @Test def testGaussianProcess(): Unit = { + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "GaussianProcess") + val trail: Trail = new TestTrail() + (0 until 100).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } + +} From 0143396f9edc770d9fcc0746502ca49dfb43924a Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 13:53:29 +0800 Subject: [PATCH 089/115] revise grid search sample a batch instead of the whole grid --- .../spark/automl/tuner/GridTunerExample.scala | 11 +++++---- .../tuner/config/ConfigurationSpace.scala | 23 ++++++++++++++++++- .../spark/automl/tuner/solver/Solver.scala | 2 +- .../angel/spark/automl/TunerTest.scala | 14 ++++++----- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala index c7ea1f6c1..b5b03dba5 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala @@ -33,10 +33,13 @@ object GridTunerExample extends App { val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") val trail: Trail = new TestTrail() - val configs: Array[Configuration] = solver.suggest() - println(s"grid size: ${configs.size}") - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) + (0 until 2001).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest() + println(s"configuration size ${configs.size}") + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } val result: (Vector, Double) = solver.optimal solver.stop println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index bae85117a..6eaf00298 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -43,6 +43,8 @@ class ConfigurationSpace( // configurations tried var preX: HashSet[Vector] = HashSet[Vector]() + var gridValues: Array[Configuration] = Array.empty + var gridIndice = 0 def getParamNum: Int = numParams @@ -145,7 +147,26 @@ class ConfigurationSpace( configs.toArray } - def gridSample(): Array[Configuration] = { + def gridSample(size: Int): Array[Configuration] = { + if (gridValues.isEmpty) { + gridValues = getGridConfigs() + } + val startIndice = gridIndice + val endIndice = (gridIndice + size) min gridValues.size + println(s"configuration space size ${gridValues.size}, " + + s"remaining ${gridValues.size - startIndice}, sample from $startIndice to $endIndice") + gridIndice = endIndice + if (startIndice == gridValues.size) { + Array.empty + } else { + val ret = new Array[Configuration](endIndice - startIndice) + Array.copy(gridValues, startIndice, ret, 0, endIndice - startIndice) + ret + } + } + + def getGridConfigs(): Array[Configuration] = { + assert(spaceSize() < Int.MaxValue, "all parameters must be discrete!") println(s"configuration space size ${spaceSize()}") var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index df1b900e9..d661a56fb 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -82,7 +82,7 @@ class Solver( case SurrogateMode.RANDOM => cs.randomSample(TunerParam.batchSize) case SurrogateMode.GRID => - cs.gridSample() + cs.gridSample(TunerParam.batchSize) } } diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala index 46f3e5207..d4ccf0897 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala @@ -45,14 +45,16 @@ class TunerTest { @Test def testGrid(): Unit = { val param1 = ParamSpace.fromConfigString("param1", "[1:10:10]") val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5.0,-3.0,0.0,3.0,5.0}") val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") val trail: Trail = new TestTrail() - val configs: Array[Configuration] = solver.suggest() - println(s"grid size: ${configs.size}") - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) + (0 until 3000).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest() + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } val result: (Vector, Double) = solver.optimal solver.stop println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") From 3a0cea2d39adf656f8191559f320795fe38117ac Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 14:53:43 +0800 Subject: [PATCH 090/115] remove random seed, add RF ut --- .../tuner/parameter/ContinuousSpace.scala | 48 +++++-------------- .../tuner/parameter/DiscreteSpace.scala | 16 ++----- .../spark/automl/tuner/solver/Solver.scala | 12 ++--- .../angel/spark/automl/TunerTest.scala | 18 +++++++ 4 files changed, 38 insertions(+), 56 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 2952394aa..66fd60b29 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -37,17 +37,12 @@ class ContinuousSpace( var upper: Double, var num: Int, distribution: Distribution.Value = Distribution.LINEAR, - override val doc: String = "continuous param space", - var seed: Int = 100) extends ParamSpace[Double](name, doc) { + override val doc: String = "continuous param space") extends ParamSpace[Double](name, doc) { private val helper: String = "supported format of continuous parameter: [0,1] or [0,1,100]" def this(name: String, lower: Double, upper: Double) = { - this(name, lower, upper, -1, seed = 100) - } - - def this(name: String, lower: Double, upper: Double, seed: Int) = { - this(name, lower, upper, -1, seed = seed) + this(name, lower, upper, -1) } def this(name: String, config: String) = { @@ -56,23 +51,16 @@ class ContinuousSpace( lower = items._1 upper = items._2 num = items._3 - if (num != -1) { - isGrid = true - gridValues = toGrid - } + isGrid = if (num == -1) false else true + gridValues = if (isGrid) getGridValues else Array.empty } - def this(name: String, config: String, seed: Int) = { - this(name, 0, 1, -1, seed = seed) - val items = parseConfig(config) - lower = items._1 - upper = items._2 - num = items._3 - if (num != -1) { - isGrid = true - gridValues = toGrid - } - } + require(lower < upper, s"lower bound should less than upper bound") + + val rd = new Random() + + var isGrid: Boolean = if (num == -1) false else true + var gridValues: Array[Double] = if (isGrid) getGridValues else Array.empty def parseConfig(input: String): (Double, Double, Int) = { assert(input.startsWith("[") && input.endsWith("]")) @@ -95,14 +83,7 @@ class ContinuousSpace( ret } - require(lower < upper, s"lower bound should less than upper bound") - - val rd = new Random(seed) - - var isGrid: Boolean = if (num == -1) false else true - var gridValues: Array[Double] = if (isGrid) toGrid else Array.empty - - def toGrid(): Array[Double] = { + def getGridValues(): Array[Double] = { var ret: ArrayBuffer[Double] = ArrayBuffer[Double]() distribution match { case Distribution.LINEAR => @@ -144,11 +125,4 @@ object ContinuousSpace { def apply(name: String, config: String) = { new ContinuousSpace(name, config) } - - def main(args: Array[String]): Unit = { - val seed: Int = 100 - val rd = new Random(seed) - println((0 until 100).map(_ => rd.nextInt(100)).mkString(",")) - println((0 until 100).map(_ => rd.nextInt(100)).mkString(",")) - } } \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 0c1d8db09..1e190bb2f 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -32,13 +32,12 @@ import scala.util.Random class DiscreteSpace[T <: AnyVal : ClassTag]( override val name: String, var values: Array[T], - override val doc: String = "discrete param", - var seed: Int = 101) extends ParamSpace[T](name, doc) { + override val doc: String = "discrete param") extends ParamSpace[T](name, doc) { private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" def this(name: String, config: String, doc: String) = { - this(name, Array.empty[T], doc, seed = 101) + this(name, Array.empty[T], doc) this.values = parseConfig(config) } @@ -46,15 +45,6 @@ class DiscreteSpace[T <: AnyVal : ClassTag]( this(name, config, "discrete param") } - def this(name: String, config: String, doc: String, seed: Int) = { - this(name, Array.empty[T], doc, seed = seed) - this.values = parseConfig(config) - } - - def this(name: String, config: String, seed: Int) = { - this(name, config, "discrete param", seed = seed) - } - def parseConfig(input: String): Array[T] = { assert(input.startsWith("{") && input.endsWith("}")) val config = input.substring(1, input.length - 1) @@ -105,7 +95,7 @@ class DiscreteSpace[T <: AnyVal : ClassTag]( } } - val rd = new Random(seed) + val rd = new Random() def getValues: Array[Double] = values.map(asDouble) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index d661a56fb..fb10643e9 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -51,15 +51,15 @@ class Solver( pType.toLowerCase match { case "discrete" => vType.toLowerCase match { - case "float" => addParam(new DiscreteSpace[Float](name, config, seed = seed)) - case "double" => addParam(new DiscreteSpace[Double](name, config, seed = seed)) - case "int" => addParam(new DiscreteSpace[Int](name, config, seed = seed)) - case "long" => addParam(new DiscreteSpace[Long](name, config, seed = seed)) + case "float" => addParam(new DiscreteSpace[Float](name, config)) + case "double" => addParam(new DiscreteSpace[Double](name, config)) + case "int" => addParam(new DiscreteSpace[Int](name, config)) + case "long" => addParam(new DiscreteSpace[Long](name, config)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case "continuous" => vType.toLowerCase match { - case "double" => addParam(new ContinuousSpace(name, config, seed = seed)) + case "double" => addParam(new ContinuousSpace(name, config)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case _ => throw new AutoMLException(s"unsupported param type $pType, should be ${PARAM_TYPES.mkString(",")}") @@ -140,7 +140,7 @@ object Solver { val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) new Solver(cs, sur, acq, opt, mode) - case SurrogateMode.GP => + case SurrogateMode.RF => val sur: Surrogate = new RFSurrogate(cs, minimize) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala index d4ccf0897..bd86eba2a 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala @@ -78,4 +78,22 @@ class TunerTest { println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") } + @Test def testRandomForest(): Unit = { + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") + val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") + val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, "RandomForest") + val trail: Trail = new TestTrail() + (0 until 25).foreach { iter => + println(s"------iteration $iter starts------") + val configs: Array[Configuration] = solver.suggest + val results: Array[Double] = trail.evaluate(configs) + solver.feed(configs, results) + } + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + } + } From 64e577f930f5ab9e66a009587b744afc613c9b7e Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sat, 16 Mar 2019 15:09:11 +0800 Subject: [PATCH 091/115] remove useless example --- .../spark/automl/tuner/GPTunerExample.scala | 47 ------------------- .../spark/automl/tuner/GridTunerExample.scala | 47 ------------------- .../spark/automl/tuner/RFTunerExample.scala | 47 ------------------- .../automl/tuner/RandomTunerExample.scala | 44 ----------------- 4 files changed, 185 deletions(-) delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala deleted file mode 100644 index afc0863a5..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GPTunerExample.scala +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.tuner - -import com.tencent.angel.spark.automl.tuner.config.Configuration -import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace} -import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} -import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace -import org.apache.spark.ml.linalg.Vector - -object GPTunerExample extends App { - - override def main(args: Array[String]): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1,10]") - val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") - val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") - val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "GaussianProcess") - val trail: Trail = new TestTrail() - (0 until 100).foreach { iter => - println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) - } - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } -} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala deleted file mode 100644 index b5b03dba5..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/GridTunerExample.scala +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.tuner - -import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} -import org.apache.spark.ml.linalg.Vector - -object GridTunerExample extends App { - - override def main(args: Array[String]): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1:10:10]") - val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", Array(0.0, 1.0, 3.0, 5.0)) - val param4: ParamSpace[Double] = new DiscreteSpace[Double]("param4", Array(-5.0, -3.0, 0.0, 3.0, 5.0)) - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") - val trail: Trail = new TestTrail() - (0 until 2001).foreach { iter => - println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest() - println(s"configuration size ${configs.size}") - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) - } - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } -} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala deleted file mode 100644 index 5f5ba4ac4..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RFTunerExample.scala +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.tuner - - -import com.tencent.angel.spark.automl.tuner.config.Configuration -import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace -import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} -import org.apache.spark.ml.linalg.Vector - -object RFTunerExample extends App { - - override def main(args: Array[String]): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1,10]") - val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") - val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") - val param4 = ParamSpace.fromConfigString("param4", "{-5:5:1}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, "RandomForest") - val trail: Trail = new TestTrail() - (0 until 25).foreach { iter => - println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) - } - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } -} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala deleted file mode 100644 index cb0dbcff2..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/RandomTunerExample.scala +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.tuner - -import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} -import com.tencent.angel.spark.automl.tuner.solver.Solver -import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} -import org.apache.spark.ml.linalg.Vector - -object RandomTunerExample extends App { - - override def main(args: Array[String]): Unit = { - val param1 = ParamSpace.fromConfigString("param3", "{2.0,3.0,4.0,5.0,6.0}") - val param2 = ParamSpace.fromConfigString("param4", "{3:10:1}") - val solver: Solver = Solver(Array(param1, param2), true, surrogate = "Random") - val trail: Trail = new TestTrail() - (0 until 100).foreach { iter => - println(s"------iteration $iter starts------") - val configs: Array[Configuration] = solver.suggest() - val results: Array[Double] = trail.evaluate(configs) - solver.feed(configs, results) - } - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - } -} From f5f7fac87ab77aec0511b5145c0b8937079a3bef Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 18 Mar 2019 10:01:29 +0800 Subject: [PATCH 092/115] refine variance selector with spark.ml interface 1. use spark.ml param 2. add transormSchema 3. add writer and reader --- .../feature/select/VarianceSelector.scala | 150 ---------- .../feature/operator/VarianceSelector.scala | 259 ++++++++++++++++++ .../automl/FeatureCrossSelectorTest.scala | 86 ++++++ .../spark/automl/FeatureSelectorTest.scala | 6 +- 4 files changed, 349 insertions(+), 152 deletions(-) delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala deleted file mode 100644 index 8414113bb..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/VarianceSelector.scala +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.feature.select - -import breeze.linalg.{argsort, DenseVector => BDV} -import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, Vectors} -import org.apache.spark.ml.{Estimator, Model} -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.Identifiable -import org.apache.spark.mllib.linalg.{Vector => OldVector} -import org.apache.spark.mllib.linalg.{Vectors => OldVectors} -import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.functions.{col, udf} -import org.apache.spark.sql.{DataFrame, Dataset, Row} -import org.apache.spark.sql.types.StructType - -import scala.util.Sorting - -class VarianceSelector(override val uid: String) extends Estimator[VarianceSelectorModel] { - - var featuresCol: String = _ - var outputCol: String = _ - var numTopFeatures: Int = _ - - def this() = this(Identifiable.randomUID("varianceSelector")) - - override def transformSchema(schema: StructType): StructType = { - schema - } - - def setFeaturesCol(value: String): this.type = { - featuresCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - override def fit(dataset: Dataset[_]): VarianceSelectorModel = { - val featuresRDD: RDD[OldVector] = dataset.select(featuresCol).rdd.map{case Row(v: Vector) => - OldVectors.dense(v.toArray) - } - val summary: MultivariateStatisticalSummary = Statistics.colStats(featuresRDD) - val variance: Array[Double] = summary.mean.toArray - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(variance)).toArray.reverse - - new VarianceSelectorModel(uid, sortedIndices) - .setInputCol(featuresCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } - - override def copy(extra: ParamMap): Estimator[VarianceSelectorModel] = { - new VarianceSelector() - .setFeaturesCol(featuresCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } - -} - -class VarianceSelectorModel(override val uid: String, - val sortedIndices: Array[Int]) extends Model[VarianceSelectorModel] { - - var inputCol: String = _ - - var outputCol: String = _ - - var numTopFeatures: Int = 50 - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - def setInputCol(value: String): this.type = { - inputCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - override def transformSchema(schema: StructType): StructType = schema - - override def transform(dataset: Dataset[_]): DataFrame = { - val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) - Sorting.quickSort(selectedIndices) - println(s"selected indices: ${selectedIndices.mkString(",")}") - - // select function, select the top features order by lasso coefficients - val select = udf { vector: Vector => - vector match { - // for DenseVector, just select top features - case dv: DenseVector => - val values: Array[Double] = dv.toArray - for (i <- 0 until selectedIndices(0)) values(i) = 0 - for (k <- 0 until selectedIndices.size - 1) { - for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { - values(i) = 0 - } - } - for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 - Vectors.dense(values) - case sv: SparseVector => - val selectedPairs = sv.indices.zip(sv.values) - .filter{ case (k, v) => selectedIndices.contains(k) } - Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) - case _ => - throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " - + vector.getClass.getSimpleName + " is given.") - } - } - dataset.withColumn(outputCol, select(col(inputCol))) - } - - override def copy(extra: ParamMap): VarianceSelectorModel = { - new VarianceSelectorModel(uid, sortedIndices) - .setNumTopFeatures(numTopFeatures) - .setInputCol(inputCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } -} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala new file mode 100644 index 000000000..480b6ef21 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala @@ -0,0 +1,259 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package org.apache.spark.ml.feature.operator + +import breeze.linalg.{argsort, DenseVector => BDV} +import org.apache.hadoop.fs.Path +import org.apache.spark.annotation.Since +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} +import org.apache.spark.ml.feature.ChiSqSelector +import org.apache.spark.ml.feature.operator.VarianceSelectorModel.VarianceSelectorModelWriter +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.ml.param.shared.{HasFeaturesCol, HasOutputCol} +import org.apache.spark.ml.param._ +import org.apache.spark.ml.util._ +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.mllib.linalg.{Vector => OldVector, Vectors => OldVectors} +import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.functions.{col, udf} +import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.{DataFrame, Dataset, Row} + +/** + * Params for [[VarianceSelector]] and [[VarianceSelectorModel]]. + */ +private[feature] trait VarianceSelectorParams extends Params + with HasFeaturesCol with HasOutputCol { + + /** + * Number of features that selector will select, ordered by descending variance. If the + * number of features is less than numTopFeatures, then this will select all features. + * Only applicable when selectorType = "numTopFeatures". + * The default value of numTopFeatures is 50. + * + * @group param + */ + final val numTopFeatures = new IntParam(this, "numTopFeatures", + "Number of features that selector will select, ordered by descending variance. If the" + + " number of features is < numTopFeatures, then this will select all features.", + ParamValidators.gtEq(1)) + setDefault(numTopFeatures -> 50) + + def getNumTopFeatures: Int = $(numTopFeatures) + + /** + * Percentile of features that selector will select, ordered by statistics value descending. + * Only applicable when selectorType = "percentile". + * Default value is 0.1. + * @group param + */ + final val percentile = new DoubleParam(this, "percentile", + "Percentile of features that selector will select, ordered by variance.", + ParamValidators.inRange(0, 1)) + setDefault(percentile -> 0.1) + + /** + * The selector type of the VarianceSelector. + * Supported options: "numTopFeatures" (default), "percentile". + * @group param + */ + final val selectorType = new Param[String](this, "selectorType", + "The selector type of the ChisqSelector. " + + "Supported options: " + VarianceSelector.supportedSelectorTypes.mkString(", "), + ParamValidators.inArray[String](VarianceSelector.supportedSelectorTypes)) + setDefault(selectorType -> VarianceSelector.NumTopFeatures) + + def getSelectorType: String = $(selectorType) +} + +/** + * Variance feature selection, which selects features with high variance. + * The selector supports different selection methods: `numTopFeatures`, `percentile`. + * - `numTopFeatures` chooses a fixed number of top features according to a chi-squared test. + * - `percentile` is similar but chooses a fraction of all features instead of a fixed number. + * By default, the selection method is `numTopFeatures`, with the default number of top features + * set to 50. + */ +class VarianceSelector(override val uid: String) + extends Estimator[VarianceSelectorModel] with VarianceSelectorParams with DefaultParamsWritable { + + def this() = this(Identifiable.randomUID("varianceSelector")) + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + def setPercentile(value: Double): this.type = set(percentile, value) + + def setSelectorType(value: String): this.type = set(selectorType, value) + + override def fit(dataset: Dataset[_]): VarianceSelectorModel = { + val featuresRDD: RDD[OldVector] = dataset.select(col($(featuresCol))).rdd.map{case Row(v: Vector) => + OldVectors.dense(v.toArray) + } + val summary: MultivariateStatisticalSummary = Statistics.colStats(featuresRDD) + val variance: Array[Double] = summary.mean.toArray + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(variance)).toArray.reverse + + val selectedIndices: Array[Int] = sortedIndices.take($(numTopFeatures)) + + new VarianceSelectorModel(uid, selectedIndices) + .setFeaturesCol($(featuresCol)) + .setOutputCol($(outputCol)) + } + + override def transformSchema(schema: StructType): StructType = { + val otherPairs = VarianceSelector.supportedSelectorTypes.filter(_ != $(selectorType)) + otherPairs.foreach { paramName: String => + if (isSet(getParam(paramName))) { + logWarning(s"Param $paramName will take no effect when selector type = ${$(selectorType)}.") + } + } + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + SchemaUtils.appendColumn(schema, $(outputCol), new VectorUDT) + } + + override def copy(extra: ParamMap): VarianceSelector = defaultCopy(extra) +} + + +object VarianceSelector extends DefaultParamsReadable[VarianceSelector] { + + /** String name for `numTopFeatures` selector type. */ + private[spark] val NumTopFeatures: String = "numTopFeatures" + + /** String name for `percentile` selector type. */ + private[spark] val Percentile: String = "percentile" + + /** Set of selector types that ChiSqSelector supports. */ + val supportedSelectorTypes: Array[String] = Array(NumTopFeatures, Percentile) + + override def load(path: String): VarianceSelector = super.load(path) +} + + +/** + * Model fitted by [[VarianceSelector]]. + */ +class VarianceSelectorModel(override val uid: String, + val selectedFeatures: Array[Int]) + extends Model[VarianceSelectorModel] with VarianceSelectorParams with MLWritable { + + private val filterIndices: Array[Int] = selectedFeatures.sorted + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + override def transformSchema(schema: StructType): StructType = { + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + val newField = prepOutputField(schema) + val outputFields = schema.fields :+ newField + StructType(outputFields) + } + + /** + * Prepare the output column field, including per-feature metadata. + */ + private def prepOutputField(schema: StructType): StructField = { + val selector = selectedFeatures.toSet + val origAttrGroup = AttributeGroup.fromStructField(schema($(featuresCol))) + val featureAttributes: Array[Attribute] = if (origAttrGroup.attributes.nonEmpty) { + origAttrGroup.attributes.get.zipWithIndex.filter(x => selector.contains(x._2)).map(_._1) + } else { + Array.fill[Attribute](selector.size)(NominalAttribute.defaultAttr) + } + val newAttributeGroup = new AttributeGroup($(outputCol), featureAttributes) + newAttributeGroup.toStructField() + } + + override def transform(dataset: Dataset[_]): DataFrame = { + println(s"select ${filterIndices.size} features: ${filterIndices.mkString(",")}") + + // select function, select the top features order by lasso coefficients + val select = udf { vector: Vector => + vector match { + // for DenseVector, just select top features + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until filterIndices(0)) values(i) = 0 + for (k <- 0 until filterIndices.size - 1) { + for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { + values(i) = 0 + } + } + for (i <- filterIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => filterIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } + } + dataset.withColumn($(outputCol), select(col($(featuresCol)))) + } + + override def copy(extra: ParamMap): VarianceSelectorModel = { + val copied = new VarianceSelectorModel(uid, filterIndices) + copyValues(copied, extra).setParent(parent) + } + + override def write: MLWriter = new VarianceSelectorModelWriter(this) +} + + +object VarianceSelectorModel extends MLReadable[VarianceSelectorModel] { + + private[VarianceSelectorModel] + class VarianceSelectorModelWriter(instance: VarianceSelectorModel) extends MLWriter { + + private case class Data(selectedFeatures: Seq[Int]) + + override protected def saveImpl(path: String): Unit = { + DefaultParamsWriter.saveMetadata(instance, path, sc) + val data = Data(instance.selectedFeatures.toSeq) + val dataPath = new Path(path, "data").toString + sparkSession.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath) + } + } + + private class VarianceSelectorModelReader extends MLReader[VarianceSelectorModel] { + + private val className = classOf[VarianceSelectorModel].getName + + override def load(path: String): VarianceSelectorModel = { + val metadata = DefaultParamsReader.loadMetadata(path, sc, className) + val data = sparkSession.read.parquet(dataPath).select("selectedFeatures").head() + val selectedFeatures = data.getAs[Seq[Int]](0).toArray + val model = new VarianceSelectorModel(metadata.uid, selectedFeatures) + DefaultParamsReader.getAndSetParams(model, metadata) + model + } + } + + override def read: MLReader[VarianceSelectorModel] = new VarianceSelectorModelReader + + override def load(path: String): VarianceSelectorModel = super.load(path) +} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala new file mode 100644 index 000000000..d34422348 --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala @@ -0,0 +1,86 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian} +import org.apache.spark.sql.SparkSession +import org.junit.Test + +class FeatureCrossSelectorTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test def testTwoOrderCrossAndSelector(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("f_f") + + val selector = new VarianceSelector() + .setFeaturesCol("f_f") + .setOutputCol("selected_f_f") + .setNumTopFeatures(50) + + val assembler = new VectorAssembler() + .setInputCols(Array("features", "selected_f_f")) + .setOutputCol("assembled_features") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, selector, assembler)) + + val crossDF = pipeline.fit(data).transform(data).persist() + data.unpersist() + + crossDF.drop("f_f", "selected_f_f") + + crossDF.show(1) + + val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitDF(0).persist() + val testDF = splitDF(1).persist() + + crossDF.unpersist() + + val originalLR = new LogisticRegression() + .setFeaturesCol("features") + .setMaxIter(20) + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + + println(s"original features auc: $originalAUC") + + val crossLR = new LogisticRegression() + .setFeaturesCol("assembled_features") + .setMaxIter(20) + + val crossAUC = crossLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + + println(s"cross features auc: $crossAUC") + } + +} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala index 61c76b02a..98a4e17c6 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -1,8 +1,10 @@ package com.tencent.angel.spark.automl -import com.tencent.angel.spark.automl.feature.select.{LassoSelector, LassoSelectorModel, RandomForestSelector, VarianceSelector} +import com.tencent.angel.spark.automl.feature.select.{LassoSelector, LassoSelectorModel, RandomForestSelector} +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} import org.apache.spark.sql.SparkSession import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.operator.VarianceSelector import org.junit.Test class FeatureSelectorTest { @@ -111,7 +113,7 @@ class FeatureSelectorTest { val selector = new VarianceSelector() .setFeaturesCol("features") .setOutputCol("selectedFeatures") - .setNumTopFeatures(50) + .setNumTopFeatures(500) val selectedDF = selector.fit(data).transform(data) From 736b8c1d42d5b0ce99af4be08dba0f44ff8cf338 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 19 Mar 2019 16:16:58 +0800 Subject: [PATCH 093/115] add distributed feature cross and selector example --- .../DistributedFeatureCrossSelector.scala | 104 ++++++++++++++++++ .../feature/operator/VarianceSelector.scala | 1 + .../automl/FeatureCrossSelectorTest.scala | 38 ++++--- .../angel/spark/automl/FeatureCrossTest.scala | 70 ++++++++---- 4 files changed, 179 insertions(+), 34 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala new file mode 100644 index 000000000..63341694f --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala @@ -0,0 +1,104 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import org.apache.spark.SparkConf +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian} +import org.apache.spark.sql.SparkSession + +object DistributedFeatureCrossSelector { + + def main(args: Array[String]): Unit = { + + val conf = new SparkConf() + + val input = conf.get("spark.input.path") + val numFeatures = conf.get("spark.num.feature") + + val spark = SparkSession.builder().config(conf).getOrCreate() + + val data = spark.read.format("libsvm") + .option("numFeatures", numFeatures) + .load(input) + .persist() + + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("f_f") + + val cartesianDF = cartesian.transform(data) + println(s"cartesian data:") + cartesianDF.show(1, truncate = false) + + val selector = new VarianceSelector() + .setFeaturesCol("f_f") + .setOutputCol("selected_f_f") + .setNumTopFeatures(100) + + val selectorDF = selector.fit(cartesianDF).transform(cartesianDF) + println(s"selector data:") + selectorDF.show(1, truncate = false) + + val assembler = new VectorAssembler() + .setInputCols(Array("features", "f_f")) + .setOutputCol("assembled_features") + + val assemblerDF = assembler.transform(selectorDF) + println(s"selector data:") + assemblerDF.show(1, truncate = false) + + // val pipeline = new Pipeline() + // .setStages(Array(cartesian, selector, assembler)) + // + // val crossDF = pipeline.fit(data).transform(data).persist() + // data.unpersist() + // crossDF.drop("f_f", "selected_f_f") + // crossDF.show(1) + + val splitDF = assemblerDF.randomSplit(Array(0.7, 0.3)) + + val trainDF = splitDF(0).persist() + val testDF = splitDF(1).persist() + + val originalLR = new LogisticRegression() + .setFeaturesCol("features") + .setLabelCol("label") + .setMaxIter(20) + .setRegParam(0.01) + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + + println(s"original features auc: $originalAUC") + + val crossLR = new LogisticRegression() + .setFeaturesCol("assembled_features") + .setLabelCol("label") + .setMaxIter(20) + .setRegParam(0.01) + + val crossAUC = crossLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + + println(s"cross features auc: $crossAUC") + + spark.close() + } +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala index 480b6ef21..15a65f228 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala @@ -245,6 +245,7 @@ object VarianceSelectorModel extends MLReadable[VarianceSelectorModel] { override def load(path: String): VarianceSelectorModel = { val metadata = DefaultParamsReader.loadMetadata(path, sc, className) + val dataPath = new Path(path, "data").toString val data = sparkSession.read.parquet(dataPath).select("selectedFeatures").head() val selectedFeatures = data.getAs[Seq[Int]](0).toArray val model = new VarianceSelectorModel(metadata.uid, selectedFeatures) diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala index d34422348..0458b008c 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala @@ -38,35 +38,45 @@ class FeatureCrossSelectorTest { .setInputCols(Array("features", "features")) .setOutputCol("f_f") + val cartesianDF = cartesian.transform(data) + println(s"cartesian data:") + cartesianDF.show(1, truncate = false) + val selector = new VarianceSelector() .setFeaturesCol("f_f") .setOutputCol("selected_f_f") - .setNumTopFeatures(50) + .setNumTopFeatures(100) + + val selectorDF = selector.fit(cartesianDF).transform(cartesianDF) + println(s"selector data:") + selectorDF.show(1, truncate = false) val assembler = new VectorAssembler() - .setInputCols(Array("features", "selected_f_f")) + .setInputCols(Array("features", "f_f")) .setOutputCol("assembled_features") - val pipeline = new Pipeline() - .setStages(Array(cartesian, selector, assembler)) - - val crossDF = pipeline.fit(data).transform(data).persist() - data.unpersist() + val assemblerDF = assembler.transform(selectorDF) + println(s"selector data:") + assemblerDF.show(1, truncate = false) - crossDF.drop("f_f", "selected_f_f") +// val pipeline = new Pipeline() +// .setStages(Array(cartesian, selector, assembler)) +// +// val crossDF = pipeline.fit(data).transform(data).persist() +// data.unpersist() +// crossDF.drop("f_f", "selected_f_f") +// crossDF.show(1) - crossDF.show(1) - - val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) + val splitDF = assemblerDF.randomSplit(Array(0.7, 0.3)) val trainDF = splitDF(0).persist() val testDF = splitDF(1).persist() - crossDF.unpersist() - val originalLR = new LogisticRegression() .setFeaturesCol("features") + .setLabelCol("label") .setMaxIter(20) + .setRegParam(0.01) val originalAUC = originalLR.fit(trainDF).evaluate(testDF) .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC @@ -75,7 +85,9 @@ class FeatureCrossSelectorTest { val crossLR = new LogisticRegression() .setFeaturesCol("assembled_features") + .setLabelCol("label") .setMaxIter(20) + .setRegParam(0.01) val crossAUC = crossLR.fit(trainDF).evaluate(testDF) .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala index 6422ae99c..7cbebf969 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala @@ -22,7 +22,7 @@ import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribut import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{Interaction, VectorAssembler} import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorCartesian} -import org.apache.spark.ml.linalg.Vectors +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vectors} import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.types.{StructField, StructType} import org.apache.spark.ml.linalg.SQLDataTypes.VectorType @@ -64,30 +64,58 @@ class FeatureCrossTest { } @Test def testVectorCartesian(): Unit = { - val spark = SparkSession.builder().master("local").getOrCreate() + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() - val data = Seq( - Row(Vectors.dense(Array(1.0,2.0,3.0)), Vectors.dense(Array(2.0,3.0,4.0)), Vectors.dense(Array(3.0,4.0,5.0))) - ) + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("cartesian_features") - val schema = Seq( - StructField("vec1", VectorType, true), - StructField("vec2", VectorType, true), - StructField("vec3", VectorType, true) - ) + val assembler = new VectorAssembler() + .setInputCols(Array("features", "cartesian_features")) + .setOutputCol("assemble_features") - val df = spark.createDataFrame( - spark.sparkContext.parallelize(data), - StructType(schema) - ) + val pipeline = new Pipeline() + .setStages(Array(cartesian, assembler)) - val vectorCartesian = new VectorCartesian() - .setInputCols(Array("vec1", "vec1")) - .setOutputCol("vec1_vec1") + val featureModel = pipeline.fit(data) + val crossDF = featureModel.transform(data) + crossDF.show(1, truncate = false) - val interacted = vectorCartesian.transform(df) + val splitData = crossDF.randomSplit(Array(0.9, 0.1)) + + val trainDF = splitData(0).persist() + val testDF = splitData(1).persist() + + // original features + val originalLR = new LogisticRegression() + .setFeaturesCol("features") + .setMaxIter(10) + .setRegParam(0.01) + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") + + // cartesian features + val cartesianLR = new LogisticRegression() + .setFeaturesCol("cartesian_features") + .setMaxIter(10) + .setRegParam(0.01) + val cartesianAUC = cartesianLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"cartesian feature: auc = $cartesianAUC") + + // original features + cartesian features + val assemblerLR = new LogisticRegression() + .setFeaturesCol("assemble_features") + .setLabelCol("label") + .setMaxIter(10) + .setRegParam(0.01) + val assemblerAUC = assemblerLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature + cartesian feature: auc = $assemblerAUC") + + spark.close() - interacted.show(truncate = false) } @Test def testSelfCartesian(): Unit = { @@ -109,7 +137,7 @@ class FeatureCrossTest { val featureModel = pipeline.fit(data) val crossDF = featureModel.transform(data) - crossDF.show(1) + crossDF.show(1, truncate = false) val splitData = crossDF.randomSplit(Array(0.7, 0.3)) @@ -138,7 +166,7 @@ class FeatureCrossTest { .setLabelCol("label") .setMaxIter(10) .setRegParam(0.01) - val assemblerAUC = assemblerLR.fit(crossDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + val assemblerAUC = assemblerLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC println(s"original feature + cartesian feature: auc = $assemblerAUC") spark.close() From e6ad92d12cbde58df6f693cebbaf0ef901d444f0 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 19 Mar 2019 20:09:15 +0800 Subject: [PATCH 094/115] refine ut test for feature cross --- .../DistributedFeatureCrossSelector.scala | 56 +++++++++---------- .../automl/FeatureCrossSelectorTest.scala | 26 +++------ 2 files changed, 34 insertions(+), 48 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala index 63341694f..556306df8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala @@ -18,7 +18,9 @@ package com.tencent.angel.spark.automl.feature.examples import org.apache.spark.SparkConf -import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.classification.LogisticRegression +import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian} import org.apache.spark.sql.SparkSession @@ -29,10 +31,10 @@ object DistributedFeatureCrossSelector { val conf = new SparkConf() - val input = conf.get("spark.input.path") - val numFeatures = conf.get("spark.num.feature") + val input = conf.get("spark.input.path", "data/a9a/a9a_123d_train_trans.libsvm") + val numFeatures = conf.get("spark.num.feature", "123") - val spark = SparkSession.builder().config(conf).getOrCreate() + val spark = SparkSession.builder().master("local").config(conf).getOrCreate() val data = spark.read.format("libsvm") .option("numFeatures", numFeatures) @@ -43,36 +45,24 @@ object DistributedFeatureCrossSelector { .setInputCols(Array("features", "features")) .setOutputCol("f_f") - val cartesianDF = cartesian.transform(data) - println(s"cartesian data:") - cartesianDF.show(1, truncate = false) - val selector = new VarianceSelector() .setFeaturesCol("f_f") .setOutputCol("selected_f_f") .setNumTopFeatures(100) - val selectorDF = selector.fit(cartesianDF).transform(cartesianDF) - println(s"selector data:") - selectorDF.show(1, truncate = false) - val assembler = new VectorAssembler() .setInputCols(Array("features", "f_f")) .setOutputCol("assembled_features") - val assemblerDF = assembler.transform(selectorDF) - println(s"selector data:") - assemblerDF.show(1, truncate = false) + val pipeline = new Pipeline() + .setStages(Array(cartesian, selector, assembler)) - // val pipeline = new Pipeline() - // .setStages(Array(cartesian, selector, assembler)) - // - // val crossDF = pipeline.fit(data).transform(data).persist() - // data.unpersist() - // crossDF.drop("f_f", "selected_f_f") - // crossDF.show(1) + val crossDF = pipeline.fit(data).transform(data).persist() + data.unpersist() + crossDF.drop("f_f", "selected_f_f") + crossDF.show(1) - val splitDF = assemblerDF.randomSplit(Array(0.7, 0.3)) + val splitDF = crossDF.randomSplit(Array(0.9, 0.1)) val trainDF = splitDF(0).persist() val testDF = splitDF(1).persist() @@ -83,9 +73,13 @@ object DistributedFeatureCrossSelector { .setMaxIter(20) .setRegParam(0.01) - val originalAUC = originalLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - + val originalPredictions = originalLR.fit(trainDF).transform(testDF) + originalPredictions.show(1) + val originalEvaluator = new BinaryClassificationEvaluator() + .setLabelCol("label") + .setRawPredictionCol("rawPrediction") + .setMetricName("areaUnderROC") + val originalAUC = originalEvaluator.evaluate(originalPredictions) println(s"original features auc: $originalAUC") val crossLR = new LogisticRegression() @@ -94,9 +88,13 @@ object DistributedFeatureCrossSelector { .setMaxIter(20) .setRegParam(0.01) - val crossAUC = crossLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - + val crossPredictions = crossLR.fit(trainDF).transform(testDF) + crossPredictions.show(1) + val crossEvaluator = new BinaryClassificationEvaluator() + .setLabelCol("label") + .setRawPredictionCol("rawPrediction") + .setMetricName("areaUnderROC") + val crossAUC = crossEvaluator.evaluate(crossPredictions) println(s"cross features auc: $crossAUC") spark.close() diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala index 0458b008c..a65b5fbfd 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala @@ -38,36 +38,24 @@ class FeatureCrossSelectorTest { .setInputCols(Array("features", "features")) .setOutputCol("f_f") - val cartesianDF = cartesian.transform(data) - println(s"cartesian data:") - cartesianDF.show(1, truncate = false) - val selector = new VarianceSelector() .setFeaturesCol("f_f") .setOutputCol("selected_f_f") .setNumTopFeatures(100) - val selectorDF = selector.fit(cartesianDF).transform(cartesianDF) - println(s"selector data:") - selectorDF.show(1, truncate = false) - val assembler = new VectorAssembler() .setInputCols(Array("features", "f_f")) .setOutputCol("assembled_features") - val assemblerDF = assembler.transform(selectorDF) - println(s"selector data:") - assemblerDF.show(1, truncate = false) + val pipeline = new Pipeline() + .setStages(Array(cartesian, selector, assembler)) -// val pipeline = new Pipeline() -// .setStages(Array(cartesian, selector, assembler)) -// -// val crossDF = pipeline.fit(data).transform(data).persist() -// data.unpersist() -// crossDF.drop("f_f", "selected_f_f") -// crossDF.show(1) + val crossDF = pipeline.fit(data).transform(data).persist() + data.unpersist() + crossDF.drop("f_f", "selected_f_f") + crossDF.show(1) - val splitDF = assemblerDF.randomSplit(Array(0.7, 0.3)) + val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) val trainDF = splitDF(0).persist() val testDF = splitDF(1).persist() From 6e99fc6417147bcf49fa1ab64f2e8d778d462844 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Wed, 20 Mar 2019 10:59:52 +0800 Subject: [PATCH 095/115] add UT for three order feature cross --- .../DistributedFeatureCrossSelector.scala | 19 ++- .../feature/examples/TwoOrderCross.scala | 138 ------------------ .../automl/FeatureCrossSelectorTest.scala | 13 +- .../angel/spark/automl/FeatureCrossTest.scala | 36 ++++- 4 files changed, 61 insertions(+), 145 deletions(-) delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala index 556306df8..ffae6e7b6 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala @@ -33,6 +33,8 @@ object DistributedFeatureCrossSelector { val input = conf.get("spark.input.path", "data/a9a/a9a_123d_train_trans.libsvm") val numFeatures = conf.get("spark.num.feature", "123") + val twoOrderNumFeatures = conf.getInt("spark.two.order.num.feature", 123) + val threeOrderNumFeatures = conf.getInt("spark.three.order.num.feature", 123) val spark = SparkSession.builder().master("local").config(conf).getOrCreate() @@ -48,18 +50,27 @@ object DistributedFeatureCrossSelector { val selector = new VarianceSelector() .setFeaturesCol("f_f") .setOutputCol("selected_f_f") - .setNumTopFeatures(100) + .setNumTopFeatures(twoOrderNumFeatures) + + val cartesian2 = new VectorCartesian() + .setInputCols(Array("features", "selected_f_f")) + .setOutputCol("f_f_f") + + val selector2 = new VarianceSelector() + .setFeaturesCol("f_f_f") + .setOutputCol("selected_f_f_f") + .setNumTopFeatures(threeOrderNumFeatures) val assembler = new VectorAssembler() - .setInputCols(Array("features", "f_f")) + .setInputCols(Array("features", "selected_f_f", "selected_f_f_f")) .setOutputCol("assembled_features") val pipeline = new Pipeline() - .setStages(Array(cartesian, selector, assembler)) + .setStages(Array(cartesian, selector, cartesian2, selector2, assembler)) val crossDF = pipeline.fit(data).transform(data).persist() data.unpersist() - crossDF.drop("f_f", "selected_f_f") + crossDF.drop("f_f", "f_f_f", "selected_f_f", "selected_f_f_f") crossDF.show(1) val splitDF = crossDF.randomSplit(Array(0.9, 0.1)) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala deleted file mode 100644 index 9107941a3..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/TwoOrderCross.scala +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - -package com.tencent.angel.spark.automl.feature.examples - -import com.tencent.angel.spark.automl.feature.FeatureUtils -import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta -import org.apache.spark.{SparkConf, SparkContext} -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} -import org.apache.spark.ml.feature.{ChiSqSelector, VectorAssembler} -import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorFilterZero} -import org.apache.spark.sql.SparkSession - -object TwoOrderCross { - - def main(args: Array[String]): Unit = { - - val conf = new SparkConf() - - val input = conf.get("spark.input.path").toString - - val spark = SparkSession.builder().config(conf).getOrCreate() - - val data = spark.read.format("libsvm") - .option("numFeatures", "123") - .load(input) - // .load("data/a9a/a9a_123d_train_trans.libsvm") - - data.persist() - - val maxDim = FeatureUtils.maxDim(data) - println(s"max dimension: $maxDim") - - // feature cross meta - var crossInfo: Map[Int, FeatureCrossMeta] = Map[Int, FeatureCrossMeta]() - (0 until maxDim).foreach(idx => crossInfo += idx -> FeatureCrossMeta(idx, idx.toString)) - - val cartesian_1 = new SelfCartesian() - .setInputCol("features") - .setOutputCol("cartesian_features_1") - - val featureMap: Map[Int, Int] = Map[Int, Int]() - - val filter_1 = new VectorFilterZero(featureMap) - .setInputCol("cartesian_features_1") - .setOutputCol("filter_features_1") - - // val selector_1 = new ChiSqSelector() - // .setNumTopFeatures(maxDim * maxDim / 100) - // .setFeaturesCol("cartesian_features_1") - // .setLabelCol("label") - // .setOutputCol("selected_features_1") - - val assembler1 = new VectorAssembler() - .setInputCols(Array("features", "filter_features_1")) - .setOutputCol("assemble_features_1") - - val cartesian_2 = new SelfCartesian() - .setInputCol("assemble_features_1") - .setOutputCol("cartesian_features_2") - - val filter_2 = new VectorFilterZero(featureMap) - .setInputCol("cartesian_features_2") - .setOutputCol("filter_features_2") - - // val selector_2 = new ChiSqSelector() - // .setNumTopFeatures(10 * maxDim) - // .setFeaturesCol("cartesian_features_2") - // .setLabelCol("label") - // .setOutputCol("selected_features_2") - - val assembler_2 = new VectorAssembler() - .setInputCols(Array("assemble_features_1", "filter_features_2")) - .setOutputCol("assemble_features_2") - - val pipeline = new Pipeline() - //.setStages(Array(cartesian_1, selector_1, assembler1)) - .setStages(Array(cartesian_1, filter_1, assembler1, cartesian_2, filter_2, assembler_2)) - - val featureModel = pipeline.fit(data) - val crossDF = featureModel.transform(data) - - val splitData = crossDF.randomSplit(Array(0.7, 0.3)) - - val trainDF = splitData(0).persist() - val testDF = splitData(1).persist() - - data.unpersist() - - println(crossDF.schema) - crossDF.show(1) - - // println("non zero features in cartesian features") - // println(FeatureUtils.countNonZero(crossDF, "cartesian_features_1").size) - - // original features - val lr_orig = new LogisticRegression() - .setFeaturesCol("features") - .setMaxIter(10) - .setRegParam(0.01) - val auc_orig = lr_orig.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"original feature: auc = $auc_orig") - - // original features + one-order cross - val lr_cross_1 = new LogisticRegression() - .setFeaturesCol("assemble_features_1") - .setMaxIter(10) - .setRegParam(0.01) - val auc_cross_1 = lr_cross_1.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"one order cross feature: auc = $auc_cross_1") - - // original features + one-order cross + two-order cross features - val lr_cross_2 = new LogisticRegression() - .setFeaturesCol("assemble_features_2") - .setMaxIter(10) - .setRegParam(0.01) - val auc_cross_2 = lr_cross_2.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - println(s"original feature + two-order cross feature: auc = $auc_cross_2") - - spark.close() - } - -} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala index a65b5fbfd..8a40ca635 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala @@ -43,12 +43,21 @@ class FeatureCrossSelectorTest { .setOutputCol("selected_f_f") .setNumTopFeatures(100) + val cartesian2 = new VectorCartesian() + .setInputCols(Array("features", "selected_f_f")) + .setOutputCol("f_f_f") + + val selector2 = new VarianceSelector() + .setFeaturesCol("f_f_f") + .setOutputCol("selected_f_f_f") + .setNumTopFeatures(1000) + val assembler = new VectorAssembler() - .setInputCols(Array("features", "f_f")) + .setInputCols(Array("features", "selected_f_f", "selected_f_f_f")) .setOutputCol("assembled_features") val pipeline = new Pipeline() - .setStages(Array(cartesian, selector, assembler)) + .setStages(Array(cartesian, selector, cartesian2, selector2, assembler)) val crossDF = pipeline.fit(data).transform(data).persist() data.unpersist() diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala index 7cbebf969..362182418 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala @@ -21,7 +21,7 @@ import org.apache.spark.ml.Pipeline import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute} import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} import org.apache.spark.ml.feature.{Interaction, VectorAssembler} -import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorCartesian} +import org.apache.spark.ml.feature.operator.{SelfCartesian, VarianceSelector, VectorCartesian} import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vectors} import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.types.{StructField, StructType} @@ -172,4 +172,38 @@ class FeatureCrossTest { spark.close() } + @Test def testThreeOrderCross(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", 8) + .load("../../data/abalone/abalone_8d_train.libsvm") + .persist() + + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("f_f") + + val cartesian2 = new VectorCartesian() + .setInputCols(Array("features", "f_f")) + .setOutputCol("f_f_f") + + val assembler = new VectorAssembler() + .setInputCols(Array("features", "f_f", "f_f_f")) + .setOutputCol("assembled_features") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, cartesian2, assembler)) + + val crossDF = pipeline.fit(data).transform(data).persist() + crossDF.show(1) + + val twoOrderDim = crossDF.head().getAs[DenseVector]("f_f").toArray.size + println(s"three order features size: $twoOrderDim") + + val threeOrderDim = crossDF.head().getAs[DenseVector]("f_f_f").toArray.size + println(s"three order features size: $threeOrderDim") + + val assembledDim = crossDF.head().getAs[DenseVector]("assembled_features").toArray.size + println(s"assembled features size: $assembledDim") + } + } From ffd74ab609ca2a92a34d3b2c87fb78a17b89e6f8 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 21 Mar 2019 17:39:18 +0800 Subject: [PATCH 096/115] bug fix: support grid search for continuous space --- .../angel/spark/automl/tuner/TunerParam.scala | 5 +++++ .../automl/tuner/config/ConfigurationSpace.scala | 15 ++++++++++++--- .../automl/tuner/parameter/ContinuousSpace.scala | 15 ++++++++++----- .../angel/spark/automl/tuner/solver/Solver.scala | 10 ++++++++++ .../tencent/angel/spark/automl/TunerTest.scala | 2 +- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala index a3bb5e05f..ead4dad8b 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/TunerParam.scala @@ -25,6 +25,7 @@ object TunerParam { var batchSize: Int = 1 var sampleSize: Int = 10 * batchSize + var defaultGridSize: Int = 100 var taskName: String = "com.tencent.angel.spark.automl.tuner.trail.TestRunner" @@ -36,6 +37,10 @@ object TunerParam { sampleSize = num } + def setDefaultGridSize(num: Int): Unit = { + defaultGridSize = num + } + def setTaskName(name: String): Unit = { taskName = name } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 6eaf00298..6d58553af 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -18,8 +18,9 @@ package com.tencent.angel.spark.automl.tuner.config +import com.tencent.angel.spark.automl.tuner.TunerParam import com.tencent.angel.spark.automl.tuner.math.BreezeOp._ -import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, ParamSpace} import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.ml.linalg.{Vector, Vectors} @@ -80,6 +81,14 @@ class ConfigurationSpace( def addHistory(vec: Vector): Unit = preX += vec + def setAllToGrid(): Unit = { + getParams().foreach{ + case cParam: ContinuousSpace => + if(!cParam.isGrid) cParam.resetGrid(TunerParam.defaultGridSize) + case _ => + } + } + def spaceSize(): Int = { var size: Int = if (numParams > 0) 1 else 0 var hasInfinite = false @@ -166,8 +175,8 @@ class ConfigurationSpace( } def getGridConfigs(): Array[Configuration] = { - assert(spaceSize() < Int.MaxValue, "all parameters must be discrete!") - println(s"configuration space size ${spaceSize()}") + //assert(spaceSize() < Int.MaxValue, "all parameters must be discrete!") + //println(s"configuration space size ${spaceSize()}") var configs: ArrayBuffer[Configuration] = new ArrayBuffer[Configuration] var tmp: ArrayBuffer[Array[Double]] = new ArrayBuffer[Array[Double]] diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 66fd60b29..423c1a855 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -18,6 +18,7 @@ package com.tencent.angel.spark.automl.tuner.parameter +import com.tencent.angel.spark.automl.tuner.TunerParam import com.tencent.angel.spark.automl.utils.{AutoMLException, Distribution} import scala.collection.mutable.ArrayBuffer @@ -51,16 +52,15 @@ class ContinuousSpace( lower = items._1 upper = items._2 num = items._3 - isGrid = if (num == -1) false else true - gridValues = if (isGrid) getGridValues else Array.empty + resetGrid(num) } require(lower < upper, s"lower bound should less than upper bound") val rd = new Random() - var isGrid: Boolean = if (num == -1) false else true - var gridValues: Array[Double] = if (isGrid) getGridValues else Array.empty + var isGrid: Boolean = false + var gridValues: Array[Double] = _ def parseConfig(input: String): (Double, Double, Int) = { assert(input.startsWith("[") && input.endsWith("]")) @@ -83,7 +83,7 @@ class ContinuousSpace( ret } - def getGridValues(): Array[Double] = { + def getGridValues(num: Int): Array[Double] = { var ret: ArrayBuffer[Double] = ArrayBuffer[Double]() distribution match { case Distribution.LINEAR => @@ -96,6 +96,11 @@ class ContinuousSpace( ret.toArray } + def resetGrid(numGrid: Int): Unit = { + isGrid = if (numGrid < 0) false else true + gridValues = if (isGrid) getGridValues(numGrid) else Array.empty + } + def getLower: Double = lower def getUpper: Double = upper diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index fb10643e9..efba1445a 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -39,6 +39,16 @@ class Solver( val PARAM_TYPES: Array[String] = Array("discrete", "continuous") + ensureValid() + + def ensureValid(): Unit = { + // ensure grid + surrogateMode match { + case SurrogateMode.GRID => cs.setAllToGrid() + case _ => + } + } + def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) def getSurrogate: Surrogate = surrogate diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala index bd86eba2a..6f2de055f 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala @@ -43,7 +43,7 @@ class TunerTest { } @Test def testGrid(): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1:10:10]") + val param1 = ParamSpace.fromConfigString("param1", "[1,10]") val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") val param4 = ParamSpace.fromConfigString("param4", "{-5.0,-3.0,0.0,3.0,5.0}") From 7df9146be19dbae9100c4a068c74cc9fa4a318a2 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 21 Mar 2019 20:59:29 +0800 Subject: [PATCH 097/115] bug fix: selector should output sparse vector --- .../feature/operator/VarianceSelector.scala | 25 +++++++++---------- .../ml/feature/operator/VectorCartesian.scala | 16 ++++++++---- .../feature/operator/VectorFilterZero.scala | 5 ++-- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala index 15a65f228..c1b586708 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala @@ -20,9 +20,7 @@ package org.apache.spark.ml.feature.operator import breeze.linalg.{argsort, DenseVector => BDV} import org.apache.hadoop.fs.Path -import org.apache.spark.annotation.Since import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} -import org.apache.spark.ml.feature.ChiSqSelector import org.apache.spark.ml.feature.operator.VarianceSelectorModel.VarianceSelectorModelWriter import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} import org.apache.spark.ml.param.shared.{HasFeaturesCol, HasOutputCol} @@ -36,6 +34,8 @@ import org.apache.spark.sql.functions.{col, udf} import org.apache.spark.sql.types.{StructField, StructType} import org.apache.spark.sql.{DataFrame, Dataset, Row} +import scala.collection.mutable.{ArrayBuffer, ArrayBuilder} + /** * Params for [[VarianceSelector]] and [[VarianceSelectorModel]]. */ @@ -187,22 +187,21 @@ class VarianceSelectorModel(override val uid: String, } override def transform(dataset: Dataset[_]): DataFrame = { - println(s"select ${filterIndices.size} features: ${filterIndices.mkString(",")}") - // select function, select the top features order by lasso coefficients val select = udf { vector: Vector => vector match { // for DenseVector, just select top features case dv: DenseVector => - val values: Array[Double] = dv.toArray - for (i <- 0 until filterIndices(0)) values(i) = 0 - for (k <- 0 until filterIndices.size - 1) { - for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { - values(i) = 0 - } - } - for (i <- filterIndices.last + 1 until values.size) values(i) = 0 - Vectors.dense(values) + val denseValues = dv.toArray + val values = filterIndices.map(denseValues) + Vectors.sparse(dv.size, filterIndices, values) +// for (i <- 0 until filterIndices(0)) values(i) = 0 +// for (k <- 0 until filterIndices.length - 1) { +// for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { +// values(i) = 0 +// } +// } +// for (i <- filterIndices.last + 1 until values.length) values(i) = 0 case sv: SparseVector => val selectedPairs = sv.indices.zip(sv.values) .filter{ case (k, v) => filterIndices.contains(k) } diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala index 4e72fe0b6..e990b8230 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala @@ -54,6 +54,7 @@ class VectorCartesian (override val uid: String) extends Transformer } override def transform(dataset: Dataset[_]): DataFrame = { + val startTime = System.currentTimeMillis() transformSchema(dataset.schema, logging = true) val inputFeatures = $(inputCols).map(c => dataset.schema(c)) val vectorDims = getVectorDimension(dataset, ${inputCols}) @@ -94,11 +95,16 @@ class VectorCartesian (override val uid: String) extends Transformer } private def getVectorDimension(dataset: Dataset[_], cols: Array[String]): Array[Int] = { - cols.map{ colName => - dataset.select(colName).first() match { - case Row(v: Vector) => v.size - case _ => throw new SparkException(s"col $colName should be Vector") - } + dataset.head match { + case row: Row => + cols.map { col => + row.getAs[Vector](col).size +// match { +// case dv: DenseVector => dv.size +// case sv: SparseVector => sv.size +// } + } + case _ => throw new SparkException(s"item in dataset should be Row.") } } diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala index 4b8fe6d0a..f2656b717 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorFilterZero.scala @@ -22,7 +22,7 @@ import org.apache.spark.annotation.Since import org.apache.spark.ml.Transformer import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute, UnresolvedAttribute} import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.ml.linalg.{SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.param.shared.{HasInputCol, HasOutputCol} import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} @@ -35,7 +35,7 @@ import scala.collection.mutable.{ArrayBuffer, ArrayBuilder} class VectorFilterZero(var featureMap: Map[Int, Int], override val uid: String) extends Transformer with HasInputCol with HasOutputCol with DefaultParamsWritable { - def this(featureMap: Map[Int, Int]) = this(featureMap, Identifiable.randomUID("drop_nonzero_feature")) + def this(featureMap: Map[Int, Int]) = this(featureMap, Identifiable.randomUID("VectorFilterZero")) /** @group setParam */ def setInputCol(value: String): this.type = set(inputCol, value) @@ -127,7 +127,6 @@ object VectorFilterZero extends DefaultParamsReadable[VectorFilterZero]{ case sv: SparseVector => sv.indices case _ => throw new IllegalArgumentException(s"Input column $column should be SparseVector.") - } }.reduce(_ union _ distinct) Iterator(mergeIndices) From 9b096a84145715604583fdeaba21e1c56b7db4dd Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 21 Mar 2019 21:00:38 +0800 Subject: [PATCH 098/115] refine example and ut --- ...cala => FeatureCrossSelectorExample.scala} | 2 +- .../examples/FeatureEngineeringExample.scala | 132 ++++++++++++++++++ ...rNonZero.scala => FilterZeroExample.scala} | 2 +- .../automl/FeatureCrossSelectorTest.scala | 95 ------------- .../angel/spark/automl/FeatureCrossTest.scala | 2 +- .../spark/automl/FeatureEngineeringTest.scala | 117 ++++++++++++++++ 6 files changed, 252 insertions(+), 98 deletions(-) rename spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/{DistributedFeatureCrossSelector.scala => FeatureCrossSelectorExample.scala} (98%) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala rename spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/{FilterNonZero.scala => FilterZeroExample.scala} (98%) delete mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureEngineeringTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureCrossSelectorExample.scala similarity index 98% rename from spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureCrossSelectorExample.scala index ffae6e7b6..58e4bc46d 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/DistributedFeatureCrossSelector.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureCrossSelectorExample.scala @@ -25,7 +25,7 @@ import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian} import org.apache.spark.sql.SparkSession -object DistributedFeatureCrossSelector { +object FeatureCrossSelectorExample { def main(args: Array[String]): Unit = { diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala new file mode 100644 index 000000000..9d5bbe3ed --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala @@ -0,0 +1,132 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.feature.examples + +import org.apache.spark.SparkConf +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.{Pipeline, PipelineStage} +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian, VectorFilterZero} +import org.apache.spark.sql.SparkSession + +import scala.collection.mutable.ArrayBuffer + +object FeatureEngineeringExample { + + def main(args: Array[String]): Unit = { + + val conf = new SparkConf() + + val input = conf.get("spark.input.path", "data/a9a/a9a_123d_train_trans.libsvm") + val numFeatures = conf.getInt("spark.num.feature", 123) + val incNumFeatures = conf.getInt("spark.inc.num.feature", 123) + val iter = conf.getInt("spark.ml.iteration", 1) + + val spark = SparkSession.builder().config(conf).getOrCreate() + + val data = spark.read.format("libsvm") + .option("numFeatures", numFeatures) + .load(input) + .persist() + + val featureMap: Map[Int, Int] = Map[Int, Int]() + + val pipelineStages: ArrayBuffer[PipelineStage] = new ArrayBuffer + val fieldsToAssembler: ArrayBuffer[String] = new ArrayBuffer[String]() + val allFields: ArrayBuffer[String] = new ArrayBuffer[String]() + + val cartesianPrefix = "_f" + val selectorPrefix = "_select" + val filterPrefix = "_filter" + var curField = "features" + fieldsToAssembler += curField + allFields += curField + + (0 until iter).foreach { iter => + val cartesian = new VectorCartesian() + .setInputCols(Array(curField, "features")) + .setOutputCol(curField + cartesianPrefix) + println(s"Cartesian -> input: $curField and features, output: ${curField + cartesianPrefix}") + pipelineStages += cartesian + curField += cartesianPrefix + allFields += curField + val selector = new VarianceSelector() + .setFeaturesCol(curField) + .setOutputCol(curField + selectorPrefix) + .setNumTopFeatures(incNumFeatures) + println(s"Selector -> input: $curField, output: ${curField + selectorPrefix}") + pipelineStages += selector + curField += selectorPrefix + allFields += curField + val filter = new VectorFilterZero(featureMap) + .setInputCol(curField) + .setOutputCol(curField + filterPrefix) + println(s"Filter -> input: $curField, output: ${curField + filterPrefix}") + pipelineStages += filter + curField += filterPrefix + fieldsToAssembler += curField + allFields += curField + } + + println(s"assembler fields: ${fieldsToAssembler.mkString(",")}") + val assembler = new VectorAssembler() + .setInputCols(fieldsToAssembler.toArray) + .setOutputCol("assembled_features") + pipelineStages += assembler + fieldsToAssembler += "assembled_features" + allFields += "assembled_features" + + val usedFields = Array("features", "assembled_features") + println(s"all fields: ${allFields.toArray.mkString(",")}") + val dropFields = allFields.filter(!usedFields.contains(_)) + println(s"drop fields: ${dropFields.toArray.mkString(",")}") + + val pipeline = new Pipeline() + .setStages(pipelineStages.toArray) + + val crossDF = pipeline.fit(data).transform(data).persist() + data.unpersist() + dropFields.foreach(crossDF.drop) + + val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) + val trainDF = splitDF(0).persist() + val testDF = splitDF(1).persist() + crossDF.unpersist() + + val originalLR = new LogisticRegression() + .setFeaturesCol("features") + .setLabelCol("label") + .setMaxIter(20) + .setRegParam(0.01) + val originalAUC = originalLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original features auc: $originalAUC") + + val crossLR = new LogisticRegression() + .setFeaturesCol("assembled_features") + .setLabelCol("label") + .setMaxIter(20) + .setRegParam(0.01) + val crossAUC = crossLR.fit(trainDF).evaluate(testDF) + .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"cross features auc: $crossAUC") + + + } + +} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterZeroExample.scala similarity index 98% rename from spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala rename to spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterZeroExample.scala index b9619a191..1e2dd7bc3 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterNonZero.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FilterZeroExample.scala @@ -23,7 +23,7 @@ import org.apache.spark.ml.Pipeline import org.apache.spark.ml.feature.operator.{SelfCartesian, VectorFilterZero} import org.apache.spark.sql.SparkSession -object FilterNonZero { +object FilterZeroExample { def main(args: Array[String]): Unit = { diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala deleted file mode 100644 index 8a40ca635..000000000 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossSelectorTest.scala +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - -package com.tencent.angel.spark.automl - -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} -import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian} -import org.apache.spark.sql.SparkSession -import org.junit.Test - -class FeatureCrossSelectorTest { - - val spark = SparkSession.builder().master("local").getOrCreate() - - @Test def testTwoOrderCrossAndSelector(): Unit = { - val data = spark.read.format("libsvm") - .option("numFeatures", "123") - .load("../../data/a9a/a9a_123d_train_trans.libsvm") - .persist() - - val cartesian = new VectorCartesian() - .setInputCols(Array("features", "features")) - .setOutputCol("f_f") - - val selector = new VarianceSelector() - .setFeaturesCol("f_f") - .setOutputCol("selected_f_f") - .setNumTopFeatures(100) - - val cartesian2 = new VectorCartesian() - .setInputCols(Array("features", "selected_f_f")) - .setOutputCol("f_f_f") - - val selector2 = new VarianceSelector() - .setFeaturesCol("f_f_f") - .setOutputCol("selected_f_f_f") - .setNumTopFeatures(1000) - - val assembler = new VectorAssembler() - .setInputCols(Array("features", "selected_f_f", "selected_f_f_f")) - .setOutputCol("assembled_features") - - val pipeline = new Pipeline() - .setStages(Array(cartesian, selector, cartesian2, selector2, assembler)) - - val crossDF = pipeline.fit(data).transform(data).persist() - data.unpersist() - crossDF.drop("f_f", "selected_f_f") - crossDF.show(1) - - val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) - - val trainDF = splitDF(0).persist() - val testDF = splitDF(1).persist() - - val originalLR = new LogisticRegression() - .setFeaturesCol("features") - .setLabelCol("label") - .setMaxIter(20) - .setRegParam(0.01) - - val originalAUC = originalLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - - println(s"original features auc: $originalAUC") - - val crossLR = new LogisticRegression() - .setFeaturesCol("assembled_features") - .setLabelCol("label") - .setMaxIter(20) - .setRegParam(0.01) - - val crossAUC = crossLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC - - println(s"cross features auc: $crossAUC") - } - -} diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala index 362182418..086da5c53 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureCrossTest.scala @@ -82,7 +82,7 @@ class FeatureCrossTest { val featureModel = pipeline.fit(data) val crossDF = featureModel.transform(data) - crossDF.show(1, truncate = false) + crossDF.show(1) val splitData = crossDF.randomSplit(Array(0.9, 0.1)) diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureEngineeringTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureEngineeringTest.scala new file mode 100644 index 000000000..0f3e2669c --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureEngineeringTest.scala @@ -0,0 +1,117 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import com.tencent.angel.spark.automl.feature.cross.FeatureCrossMeta +import org.apache.spark.ml.{Pipeline, PipelineStage} +import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian, VectorFilterZero} +import org.apache.spark.sql.SparkSession +import org.junit.Test + +import scala.collection.mutable.ArrayBuffer + +class FeatureEngineeringTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test def testIterativeCross(): Unit = { + + val dim = 123 + val incDim = 123 + val iter = 3 + + val data = spark.read.format("libsvm") + .option("numFeatures", dim) + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val featureMap: Map[Int, Int] = Map[Int, Int]() + + val pipelineStages: ArrayBuffer[PipelineStage] = new ArrayBuffer + val usedFields: ArrayBuffer[String] = new ArrayBuffer[String]() + + val cartesianPrefix = "_f" + val selectorPrefix = "_select" + val filterPrefix = "_filter" + var curField = "features" + usedFields += curField + + (0 until iter).foreach { iter => + val cartesian = new VectorCartesian() + .setInputCols(Array(curField, "features")) + .setOutputCol(curField + cartesianPrefix) + println(s"Cartesian -> input $curField and features, output ${curField + cartesianPrefix}") + pipelineStages += cartesian + curField += cartesianPrefix + val selector = new VarianceSelector() + .setFeaturesCol(curField) + .setOutputCol(curField + selectorPrefix) + .setNumTopFeatures(incDim) + println(s"Selector -> input $curField, output ${curField + selectorPrefix}") + pipelineStages += selector + curField += selectorPrefix + val filter = new VectorFilterZero(featureMap) + .setInputCol(curField) + .setOutputCol(curField + filterPrefix) + println(s"Filter -> input $curField, output ${curField + filterPrefix}") + pipelineStages += filter + curField += filterPrefix + usedFields += curField + } + + println(s"used fields: ${usedFields.toArray.mkString(",")}") + + val assembler = new VectorAssembler() + .setInputCols(usedFields.toArray) + .setOutputCol("assembled_features") + pipelineStages += assembler + + val pipeline = new Pipeline() + .setStages(pipelineStages.toArray) + + val crossDF = pipeline.fit(data).transform(data).persist() + data.unpersist() + crossDF.show(1) + +// val splitDF = crossDF.randomSplit(Array(0.7, 0.3)) +// +// val trainDF = splitDF(0).persist() +// val testDF = splitDF(1).persist() +// +// val originalLR = new LogisticRegression() +// .setFeaturesCol("features") +// .setLabelCol("label") +// .setMaxIter(20) +// .setRegParam(0.01) +// val originalAUC = originalLR.fit(trainDF).evaluate(testDF) +// .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC +// println(s"original features auc: $originalAUC") +// +// val crossLR = new LogisticRegression() +// .setFeaturesCol("assembled_features") +// .setLabelCol("label") +// .setMaxIter(20) +// .setRegParam(0.01) +// val crossAUC = crossLR.fit(trainDF).evaluate(testDF) +// .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC +// println(s"cross features auc: $crossAUC") + } + +} From 6bbcc73656fd19ff42cf9a06ae71f70f6db392ab Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 22 Mar 2019 11:47:35 +0800 Subject: [PATCH 099/115] bug fix: BinaryLogisticRegressionSummary interface error --- .../examples/FeatureEngineeringExample.scala | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala index 9d5bbe3ed..5058f81b0 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/examples/FeatureEngineeringExample.scala @@ -19,6 +19,7 @@ package com.tencent.angel.spark.automl.feature.examples import org.apache.spark.SparkConf import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} +import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator import org.apache.spark.ml.{Pipeline, PipelineStage} import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.ml.feature.operator.{VarianceSelector, VectorCartesian, VectorFilterZero} @@ -113,8 +114,13 @@ object FeatureEngineeringExample { .setLabelCol("label") .setMaxIter(20) .setRegParam(0.01) - val originalAUC = originalLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + val originalPredictions = originalLR.fit(trainDF).transform(testDF) + originalPredictions.show(1) + val originalEvaluator = new BinaryClassificationEvaluator() + .setLabelCol("label") + .setRawPredictionCol("rawPrediction") + .setMetricName("areaUnderROC") + val originalAUC = originalEvaluator.evaluate(originalPredictions) println(s"original features auc: $originalAUC") val crossLR = new LogisticRegression() @@ -122,11 +128,14 @@ object FeatureEngineeringExample { .setLabelCol("label") .setMaxIter(20) .setRegParam(0.01) - val crossAUC = crossLR.fit(trainDF).evaluate(testDF) - .asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + val crossPredictions = crossLR.fit(trainDF).transform(testDF) + crossPredictions.show(1) + val crossEvaluator = new BinaryClassificationEvaluator() + .setLabelCol("label") + .setRawPredictionCol("rawPrediction") + .setMetricName("areaUnderROC") + val crossAUC = crossEvaluator.evaluate(crossPredictions) println(s"cross features auc: $crossAUC") - - } } From 87780bd017bc8e51312ab84a4bd7c03f77a9e885 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 22 Mar 2019 20:19:39 +0800 Subject: [PATCH 100/115] bug fix: one param returns a simgle vector --- .../spark/automl/tuner/config/ConfigurationSpace.scala | 3 +-- .../scala/com/tencent/angel/spark/automl/TunerTest.scala | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 6d58553af..37a4219c7 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -189,9 +189,8 @@ class ConfigurationSpace( val paramsArray: Array[Array[Double]] = tmp.toArray if (numParams == 1) { - val paramsGrid: Array[Array[Double]] = paramsArray var tmp: ArrayBuffer[Vector] = new ArrayBuffer[Vector] - paramsGrid.foreach { + paramsArray.head.foreach { tmp += Vectors.dense(_) } val paramsVec = tmp.toArray diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala index 6f2de055f..7fcb8e7e6 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/TunerTest.scala @@ -43,11 +43,12 @@ class TunerTest { } @Test def testGrid(): Unit = { - val param1 = ParamSpace.fromConfigString("param1", "[1,10]") + val param1 = ParamSpace.fromConfigString("param1", "[0.1,10]") val param2 = ParamSpace.fromConfigString("param2", "[-5:5:10]") - val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") - val param4 = ParamSpace.fromConfigString("param4", "{-5.0,-3.0,0.0,3.0,5.0}") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") +// val param3 = ParamSpace.fromConfigString("param3", "{0.0,1.0,3.0,5.0}") +// val param4 = ParamSpace.fromConfigString("param4", "{-5.0,-3.0,0.0,3.0,5.0}") +// val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate = "Grid") + val solver: Solver = Solver(Array(param1, param2), true, surrogate = "Grid") val trail: Trail = new TestTrail() (0 until 3000).foreach { iter => println(s"------iteration $iter starts------") From c5b5fa492b1ff08eea19b0a729100aa527cda2b4 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 26 Mar 2019 15:03:09 +0800 Subject: [PATCH 101/115] reduce tolerance of LBFGS for GP --- .../com/tencent/angel/spark/automl/tuner/model/GPModel.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 57ce64595..67b743bfd 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -48,7 +48,7 @@ class GPModel(val covFunc: Covariance, val kernelDiffFunc = new GPKernelDiffFunc(this) val initParams = BDV(covParams.toArray :+ noiseStdDev) - val optimizer = new LBFGS[BDV[Double]](maxIter = 20, m = 7, tolerance = 0.1) + val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 7, tolerance = 1e-10) val newParams = optimizer.minimize(kernelDiffFunc, initParams) //println(optimizer) //println(s"new params: ${newParams}") From 9fd6712da6a5468f7473cc5bc035583f50698d7a Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Tue, 26 Mar 2019 21:39:55 +0800 Subject: [PATCH 102/115] Add FtestSelector, fix the problem of the filterIndices, add setNumTopFeatures for each fitted selector, --- .../automl/feature/select/LassoSelector.scala | 163 --------- .../feature/select/RandomForestSelector.scala | 160 --------- .../ml/feature/operator/FtestSelector.scala | 322 ++++++++++++++++++ .../ml/feature/operator/LassoSelector.scala | 266 +++++++++++++++ .../operator/RandomForestSelector.scala | 264 ++++++++++++++ .../feature/operator/VarianceSelector.scala | 6 +- .../spark/automl/FeatureSelectorTest.scala | 81 +++-- 7 files changed, 917 insertions(+), 345 deletions(-) delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala delete mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/FtestSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/LassoSelector.scala create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala deleted file mode 100644 index c6eb8f70d..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/LassoSelector.scala +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.feature.select - -import org.apache.spark.ml.classification.LogisticRegression -import org.apache.spark.ml.{Estimator, Model} -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.Identifiable -import org.apache.spark.ml.linalg.{Vector, Vectors} -import org.apache.spark.ml.linalg.{DenseVector, SparseVector} -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.{ArrayType, StructType} -import org.apache.spark.sql.functions._ -import breeze.linalg.argsort -import breeze.linalg.{DenseVector => BDV} -import Math.abs - -import scala.util.Sorting - - -class LassoSelector(override val uid: String) extends Estimator[LassoSelectorModel]{ - - var featuresCol: String = _ - var outputCol: String = _ - var labelCol: String = _ - var numTopFeatures: Int = _ - - def this() = this(Identifiable.randomUID("LassoSelector")) - - override def transformSchema(schema: StructType): StructType = { - schema - } - - def setFeaturesCol(value: String): this.type = { - featuresCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - def setLabelCol(value: String): this.type = { - labelCol = value - this - } - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - override def fit(dataset: Dataset[_]): LassoSelectorModel = { - - val lr = new LogisticRegression() - .setFeaturesCol(featuresCol) - .setLabelCol(labelCol) - .setElasticNetParam(1.0) - .setMaxIter(10) - - val lrModel = lr.fit(dataset) - - val coefficients: Array[Double] = lrModel.coefficients.toArray.map(i => abs(i)) - - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(coefficients)).toArray.reverse - - new LassoSelectorModel(uid, sortedIndices) - .setInputCol(featuresCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } - - override def copy(extra: ParamMap): Estimator[LassoSelectorModel] = { - new LassoSelector(uid) - .setFeaturesCol(featuresCol) - .setOutputCol(outputCol) - .setLabelCol(labelCol) - .setNumTopFeatures(numTopFeatures) - } -} - -class LassoSelectorModel(override val uid: String, - val sortedIndices: Array[Int]) extends Model[LassoSelectorModel]{ - - var inputCol: String = _ - - var outputCol: String = _ - - var numTopFeatures: Int = _ - - def setInputCol(value: String): this.type = { - inputCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - override def transformSchema(schema: StructType): StructType = schema - - override def transform(dataset: Dataset[_]): DataFrame = { - - val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) - Sorting.quickSort(selectedIndices) - println(s"selected indices: ${selectedIndices.mkString(",")}") - - // select function, select the top features order by lasso cofficients - val select = udf { vector: Vector => - vector match { - // for DenseVector, just select top features - case dv: DenseVector => - val values: Array[Double] = dv.toArray - for (i <- 0 until selectedIndices(0)) values(i) = 0 - for (k <- 0 until selectedIndices.size - 1) { - for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { - values(i) = 0 - } - } - for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 - Vectors.dense(values) - case sv: SparseVector => - val selectedPairs = sv.indices.zip(sv.values) - .filter{ case (k, v) => selectedIndices.contains(k) } - Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) - case _ => - throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " - + vector.getClass.getSimpleName + " is given.") - } - } - dataset.withColumn(outputCol, select(col(inputCol))) - } - - override def copy(extra: ParamMap): LassoSelectorModel = { - new LassoSelectorModel(uid, sortedIndices) - .setInputCol(inputCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } -} diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala deleted file mode 100644 index 650fa73e8..000000000 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/select/RandomForestSelector.scala +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Angel available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/Apache-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - * - */ - - -package com.tencent.angel.spark.automl.feature.select - -import org.apache.spark.ml.classification.RandomForestClassifier -import org.apache.spark.ml.{Estimator, Model} -import org.apache.spark.ml.param.ParamMap -import org.apache.spark.ml.util.Identifiable -import org.apache.spark.ml.linalg.{Vector, Vectors, DenseVector, SparseVector} -import org.apache.spark.sql.{DataFrame, Dataset} -import org.apache.spark.sql.types.StructType -import org.apache.spark.sql.functions._ -import breeze.linalg.argsort -import breeze.linalg.{DenseVector => BDV} - -import scala.util.Sorting - - -class RandomForestSelector(override val uid: String) extends Estimator[RandomForestSelectorModel]{ - - var featuresCol: String = _ - var outputCol: String = _ - var labelCol: String = _ - var numTopFeatures: Int = _ - - def this() = this(Identifiable.randomUID("RandomForestSelector")) - - override def transformSchema(schema: StructType): StructType = { - schema - } - - def setFeaturesCol(value: String): this.type = { - featuresCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - def setLabelCol(value: String): this.type = { - labelCol = value - this - } - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - override def fit(dataset: Dataset[_]): RandomForestSelectorModel = { - - val rf = new RandomForestClassifier() - .setFeaturesCol(featuresCol) - .setLabelCol(labelCol) - - val rfModel = rf.fit(dataset) - - val featureImportances: Array[Double] = rfModel.featureImportances.toArray - - val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(featureImportances)).toArray.reverse - - new RandomForestSelectorModel(uid, sortedIndices) - .setInputCol(featuresCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - - } - - override def copy(extra: ParamMap): RandomForestSelector = { - new RandomForestSelector(uid) - .setFeaturesCol(featuresCol) - .setOutputCol(outputCol) - .setLabelCol(labelCol) - .setNumTopFeatures(numTopFeatures) - } -} - -class RandomForestSelectorModel(override val uid: String, - val sortedIndices: Array[Int]) extends Model[RandomForestSelectorModel]{ - - var inputCol: String = _ - - var outputCol: String = _ - - var numTopFeatures: Int = 50 - - def setNumTopFeatures(value: Int): this.type = { - numTopFeatures = value - this - } - - def setInputCol(value: String): this.type = { - inputCol = value - this - } - - def setOutputCol(value: String): this.type = { - outputCol = value - this - } - - override def transformSchema(schema: StructType): StructType = schema - - override def transform(dataset: Dataset[_]): DataFrame = { - - val selectedIndices: Array[Int] = sortedIndices.take(numTopFeatures) - Sorting.quickSort(selectedIndices) - println(s"selected indices: ${selectedIndices.mkString(",")}") - - // select function, select the top features order by feture importrances of random forest - val select = udf { vector: Vector => - vector match { - case dv: DenseVector => - val values: Array[Double] = dv.toArray - for (i <- 0 until selectedIndices(0)) values(i) = 0 - for (k <- 0 until selectedIndices.size - 1) { - for (i <- selectedIndices(k) + 1 until selectedIndices(k+1)) { - values(i) = 0 - } - } - for (i <- selectedIndices.last + 1 until values.size) values(i) = 0 - Vectors.dense(values) - case sv: SparseVector => - val selectedPairs = sv.indices.zip(sv.values) - .filter{ case (k, v) => selectedIndices.contains(k) } - Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) - case _ => - throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " - + vector.getClass.getSimpleName + " is given.") - } - } - dataset.withColumn(outputCol, select(col(inputCol))) - } - - override def copy(extra: ParamMap): RandomForestSelectorModel = { - new RandomForestSelectorModel(uid, sortedIndices) - .setNumTopFeatures(numTopFeatures) - .setInputCol(inputCol) - .setOutputCol(outputCol) - .setNumTopFeatures(numTopFeatures) - } -} \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/FtestSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/FtestSelector.scala new file mode 100644 index 000000000..29c963516 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/FtestSelector.scala @@ -0,0 +1,322 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package org.apache.spark.ml.feature.operator + +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.ml.param._ +import org.apache.spark.ml.util._ +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.mllib.linalg.{Vector => OldVector, Vectors => OldVectors} +import org.apache.spark.sql.{DataFrame, Dataset, Row} +import org.apache.spark.sql.types.{ArrayType, StructField, StructType} +import org.apache.spark.sql.functions._ +import breeze.linalg.argsort +import breeze.linalg.{DenseVector => BDV, Vector => BV} +import breeze.stats.mean + +import org.apache.hadoop.fs.Path +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} +import org.apache.spark.ml.param.shared.{HasFeaturesCol, HasLabelCol, HasOutputCol} +import org.apache.spark.mllib.regression.LabeledPoint +import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} +import org.apache.spark.rdd.RDD + + + + +/** + * Params for [[FtestSelector]] and [[FtestSelectorModel]]. + */ +private[feature] trait FtestSelectorParams extends Params + with HasFeaturesCol with HasOutputCol with HasLabelCol { + + /** + * Number of features that selector will select, ordered by descending lasso cofficients. If the + * number of features is less than numTopFeatures, then this will select all features. + * Only applicable when selectorType = "numTopFeatures". + * The default value of numTopFeatures is 50. + * + * @group param + */ + final val numTopFeatures = new IntParam(this, "numTopFeatures", + "Number of features that selector will select, ordered by descending lasso cofficients. If the" + + " number of features is < numTopFeatures, then this will select all features.", + ParamValidators.gtEq(1)) + setDefault(numTopFeatures -> 50) + + def getNumTopFeatures: Int = $(numTopFeatures) + + /** + * Percentile of features that selector will select, ordered by statistics value descending. + * Only applicable when selectorType = "percentile". + * Default value is 0.1. + * @group param + */ + final val percentile = new DoubleParam(this, "percentile", + "Percentile of features that selector will select, ordered by lasso cofficients.", + ParamValidators.inRange(0, 1)) + setDefault(percentile -> 0.1) + + /** + * The selector type of the FtestSelector. + * Supported options: "numTopFeatures" (default), "percentile". + * @group param + */ + final val selectorType = new Param[String](this, "selectorType", + "The selector type of the ChisqSelector. " + + "Supported options: " + FtestSelector.supportedSelectorTypes.mkString(", "), + ParamValidators.inArray[String](FtestSelector.supportedSelectorTypes)) + setDefault(selectorType -> FtestSelector.NumTopFeatures) + + def getSelectorType: String = $(selectorType) +} + + +/** + * Ftest feature selection, which selects features with high cofficients of the trained Logistic Regression Model. + * The selector supports different selection methods: `numTopFeatures`, `percentile`. + * - `numTopFeatures` chooses a fixed number of top features according to a chi-squared test. + * - `percentile` is similar but chooses a fraction of all features instead of a fixed number. + * By default, the selection method is `numTopFeatures`, with the default number of top features + * set to 50. + */ +class FtestSelector(override val uid: String) + extends Estimator[FtestSelectorModel] with FtestSelectorParams with DefaultParamsWritable { + + def this() = this(Identifiable.randomUID("FtestSelector")) + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setLabelCol(value: String): this.type = set(labelCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + def setPercentile(value: Double): this.type = set(percentile, value) + + def setSelectorType(value: String): this.type = set(selectorType, value) + + /** + * The function is implemented according to the f_oneway function in scipy + */ + private def fOneWay(data: RDD[LabeledPoint]): Array[Double] = { + + def sumOfSquares(rdd: RDD[OldVector], nFeatures: Int): BV[Double] = { + val squares: RDD[OldVector] = rdd.map{ v => + val bv = v.asBreeze + OldVectors.fromBreeze(bv.map(i => i * i)) + } + squares.reduce((v1, v2) => OldVectors.fromBreeze(v1.asBreeze + v2.asBreeze)).asBreeze + } + + def squareOfSums(rdd: RDD[OldVector], nFeatures: Int): BV[Double] = { + val sum: BV[Double] = rdd.reduce((v1, v2) => OldVectors.fromBreeze(v1.asBreeze + v2.asBreeze)).asBreeze + sum.map(i => i * i) + } + + + val nClasses = data.map(point => point.label).collect().toSet.size + val nSamples = data.count() + val args = new Array[RDD[OldVector]](nClasses) + for (label <- 0 until nClasses) { + args(label) = data.filter(point => point.label == label.toDouble).map(point => point.features) + } + var allData: RDD[OldVector] = data.map(point => point.features) + val summary: MultivariateStatisticalSummary = Statistics.colStats(allData) + val offset = mean(summary.mean.asBreeze) + + allData = allData.map(v => OldVectors.fromBreeze(v.asBreeze - offset)) + + val nFeatures = allData.take(1)(0).size + + val sstot = sumOfSquares(allData, nFeatures) - squareOfSums(allData, nFeatures) / nSamples.toDouble +// println("ssot = \n" + sstot.toArray.mkString(",")) + + var ssbn = BV.zeros[Double](nFeatures) + for (arg <- args) { + ssbn += squareOfSums(arg.map(v => OldVectors.fromBreeze(v.asBreeze - offset)), nFeatures) / arg.count().toDouble + } + ssbn -= squareOfSums(allData, nFeatures) / nSamples.toDouble +// println("ssbn:\n" + ssbn.toArray.mkString(", ")) + + val sswn: BV[Double] = sstot - ssbn + + val dfbn = nClasses - 1 + val dfwn = nSamples - nClasses + val msb = ssbn / dfbn.toDouble + val msw = sswn / dfwn.toDouble + + val fValue = msb / msw + + fValue.toArray + } + + override def fit(dataset: Dataset[_]): FtestSelectorModel = { + + val data: RDD[LabeledPoint] = dataset.rdd.map{ case Row(label: Double, v: Vector) => + LabeledPoint(label, OldVectors.fromML(v)) + } + + val fValues = fOneWay(data) +// println("fValues:\n" + fValues.mkString(", ")) + + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(fValues)).toArray.reverse + + new FtestSelectorModel(uid, sortedIndices) + .setFeaturesCol(${featuresCol}) + .setOutputCol(${outputCol}) + .setNumTopFeatures(${numTopFeatures}) + } + + override def transformSchema(schema: StructType): StructType = { + val otherPairs = FtestSelector.supportedSelectorTypes.filter(_ != $(selectorType)) + otherPairs.foreach { paramName: String => + if (isSet(getParam(paramName))) { + logWarning(s"Param $paramName will take no effect when selector type = ${$(selectorType)}.") + } + } + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + SchemaUtils.appendColumn(schema, $(outputCol), new VectorUDT) + } + + override def copy(extra: ParamMap): FtestSelector = defaultCopy(extra) +} + +object FtestSelector extends DefaultParamsReadable[FtestSelector] { + + /** String name for `numTopFeatures` selector type. */ + private[spark] val NumTopFeatures: String = "numTopFeatures" + + /** String name for `percentile` selector type. */ + private[spark] val Percentile: String = "percentile" + + /** Set of selector types that FtestSelector supports. */ + val supportedSelectorTypes: Array[String] = Array(NumTopFeatures, Percentile) + + override def load(path: String): FtestSelector = super.load(path) +} + +/** + * Model fitted by [[FtestSelector]]. + */ +class FtestSelectorModel(override val uid: String, + val selectedFeatures: Array[Int]) + extends Model[FtestSelectorModel] with FtestSelectorParams { + + private var filterIndices: Array[Int] = selectedFeatures.take(${numTopFeatures}).sorted + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + override def transformSchema(schema: StructType): StructType = { + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + val newField = prepOutputField(schema) + val outputFields = schema.fields :+ newField + StructType(outputFields) + } + + /** + * Prepare the output column field, including per-feature metadata. + */ + private def prepOutputField(schema: StructType): StructField = { + val selector = selectedFeatures.toSet + val origAttrGroup = AttributeGroup.fromStructField(schema($(featuresCol))) + val featureAttributes: Array[Attribute] = if (origAttrGroup.attributes.nonEmpty) { + origAttrGroup.attributes.get.zipWithIndex.filter(x => selector.contains(x._2)).map(_._1) + } else { + Array.fill[Attribute](selector.size)(NominalAttribute.defaultAttr) + } + val newAttributeGroup = new AttributeGroup($(outputCol), featureAttributes) + newAttributeGroup.toStructField() + } + + override def transform(dataset: Dataset[_]): DataFrame = { + filterIndices = selectedFeatures.take(${numTopFeatures}).sorted +// println(s"select ${filterIndices.size} features: ${filterIndices.mkString(",")}") + + // select function, select the top features order by lasso coefficients + val select = udf { vector: Vector => + vector match { + // for DenseVector, just select top features + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until filterIndices(0)) values(i) = 0 + for (k <- 0 until filterIndices.size - 1) { + for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { + values(i) = 0 + } + } + for (i <- filterIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => filterIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } + } + dataset.withColumn($(outputCol), select(col($(featuresCol)))) + } + + + override def copy(extra: ParamMap): FtestSelectorModel = { + val copied = new FtestSelectorModel(uid, filterIndices) + copyValues(copied, extra).setParent(parent) + } +} + +object FtestSelectorModel extends MLReadable[FtestSelectorModel] { + + private[FtestSelectorModel] + class FtestSelectorModelWriter(instance: FtestSelectorModel) extends MLWriter { + + private case class Data(selectedFeatures: Seq[Int]) + + override protected def saveImpl(path: String): Unit = { + DefaultParamsWriter.saveMetadata(instance, path, sc) + val data = Data(instance.selectedFeatures.toSeq) + val dataPath = new Path(path, "data").toString + sparkSession.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath) + } + } + + private class FtestSelectorModelReader extends MLReader[FtestSelectorModel] { + + private val className = classOf[FtestSelectorModel].getName + + override def load(path: String): FtestSelectorModel = { + val metadata = DefaultParamsReader.loadMetadata(path, sc, className) + val data = sparkSession.read.parquet(path).select("selectedFeatures").head() + val selectedFeatures = data.getAs[Seq[Int]](0).toArray + val model = new FtestSelectorModel(metadata.uid, selectedFeatures) + DefaultParamsReader.getAndSetParams(model, metadata) + model + } + } + + override def read: MLReader[FtestSelectorModel] = new FtestSelectorModelReader + + override def load(path: String): FtestSelectorModel = super.load(path) +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/LassoSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/LassoSelector.scala new file mode 100644 index 000000000..d070ebbd9 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/LassoSelector.scala @@ -0,0 +1,266 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package org.apache.spark.ml.feature.operator + +import org.apache.spark.ml.classification.LogisticRegression +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.ml.param._ +import org.apache.spark.ml.util._ +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.sql.{DataFrame, Dataset} +import org.apache.spark.sql.types.{ArrayType, StructField, StructType} +import org.apache.spark.sql.functions._ +import breeze.linalg.argsort +import breeze.linalg.{DenseVector => BDV} +import Math.abs + +import org.apache.hadoop.fs.Path +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} +import org.apache.spark.ml.param.shared.{HasFeaturesCol, HasLabelCol, HasOutputCol} + + +/** + * Params for [[LassoSelector]] and [[LassoSelectorModel]]. + */ +private[feature] trait LassoSelectorParams extends Params + with HasFeaturesCol with HasOutputCol with HasLabelCol { + + /** + * Number of features that selector will select, ordered by descending lasso cofficients. If the + * number of features is less than numTopFeatures, then this will select all features. + * Only applicable when selectorType = "numTopFeatures". + * The default value of numTopFeatures is 50. + * + * @group param + */ + final val numTopFeatures = new IntParam(this, "numTopFeatures", + "Number of features that selector will select, ordered by descending lasso cofficients. If the" + + " number of features is < numTopFeatures, then this will select all features.", + ParamValidators.gtEq(1)) + setDefault(numTopFeatures -> 50) + + def getNumTopFeatures: Int = $(numTopFeatures) + + /** + * Percentile of features that selector will select, ordered by statistics value descending. + * Only applicable when selectorType = "percentile". + * Default value is 0.1. + * @group param + */ + final val percentile = new DoubleParam(this, "percentile", + "Percentile of features that selector will select, ordered by lasso cofficients.", + ParamValidators.inRange(0, 1)) + setDefault(percentile -> 0.1) + + /** + * The selector type of the LassoSelector. + * Supported options: "numTopFeatures" (default), "percentile". + * @group param + */ + final val selectorType = new Param[String](this, "selectorType", + "The selector type of the ChisqSelector. " + + "Supported options: " + LassoSelector.supportedSelectorTypes.mkString(", "), + ParamValidators.inArray[String](LassoSelector.supportedSelectorTypes)) + setDefault(selectorType -> LassoSelector.NumTopFeatures) + + def getSelectorType: String = $(selectorType) +} + + +/** + * Lasso feature selection, which selects features with high cofficients of the trained Logistic Regression Model. + * The selector supports different selection methods: `numTopFeatures`, `percentile`. + * - `numTopFeatures` chooses a fixed number of top features according to a chi-squared test. + * - `percentile` is similar but chooses a fraction of all features instead of a fixed number. + * By default, the selection method is `numTopFeatures`, with the default number of top features + * set to 50. + */ +class LassoSelector(override val uid: String) + extends Estimator[LassoSelectorModel] with LassoSelectorParams with DefaultParamsWritable { + + def this() = this(Identifiable.randomUID("LassoSelector")) + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setLabelCol(value: String): this.type = set(labelCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + def setPercentile(value: Double): this.type = set(percentile, value) + + def setSelectorType(value: String): this.type = set(selectorType, value) + + override def fit(dataset: Dataset[_]): LassoSelectorModel = { + + val lr = new LogisticRegression() + .setFeaturesCol(${featuresCol}) + .setLabelCol(${labelCol}) + .setElasticNetParam(1.0) + .setMaxIter(10) + + val lrModel = lr.fit(dataset) + + val coefficients: Array[Double] = lrModel.coefficients.toArray.map(i => abs(i)) + + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(coefficients)).toArray.reverse + + new LassoSelectorModel(uid, sortedIndices) + .setFeaturesCol(${featuresCol}) + .setOutputCol(${outputCol}) + .setNumTopFeatures(${numTopFeatures}) + } + + override def transformSchema(schema: StructType): StructType = { + val otherPairs = LassoSelector.supportedSelectorTypes.filter(_ != $(selectorType)) + otherPairs.foreach { paramName: String => + if (isSet(getParam(paramName))) { + logWarning(s"Param $paramName will take no effect when selector type = ${$(selectorType)}.") + } + } + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + SchemaUtils.appendColumn(schema, $(outputCol), new VectorUDT) + } + + override def copy(extra: ParamMap): LassoSelector = defaultCopy(extra) +} + +object LassoSelector extends DefaultParamsReadable[LassoSelector] { + + /** String name for `numTopFeatures` selector type. */ + private[spark] val NumTopFeatures: String = "numTopFeatures" + + /** String name for `percentile` selector type. */ + private[spark] val Percentile: String = "percentile" + + /** Set of selector types that ChiSqSelector supports. */ + val supportedSelectorTypes: Array[String] = Array(NumTopFeatures, Percentile) + + override def load(path: String): LassoSelector = super.load(path) +} + +/** + * Model fitted by [[LassoSelector]]. + */ +class LassoSelectorModel(override val uid: String, + val selectedFeatures: Array[Int]) + extends Model[LassoSelectorModel] with LassoSelectorParams { + + private var filterIndices: Array[Int] = selectedFeatures.sorted + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + override def transformSchema(schema: StructType): StructType = { + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + val newField = prepOutputField(schema) + val outputFields = schema.fields :+ newField + StructType(outputFields) + } + + /** + * Prepare the output column field, including per-feature metadata. + */ + private def prepOutputField(schema: StructType): StructField = { + val selector = selectedFeatures.toSet + val origAttrGroup = AttributeGroup.fromStructField(schema($(featuresCol))) + val featureAttributes: Array[Attribute] = if (origAttrGroup.attributes.nonEmpty) { + origAttrGroup.attributes.get.zipWithIndex.filter(x => selector.contains(x._2)).map(_._1) + } else { + Array.fill[Attribute](selector.size)(NominalAttribute.defaultAttr) + } + val newAttributeGroup = new AttributeGroup($(outputCol), featureAttributes) + newAttributeGroup.toStructField() + } + + override def transform(dataset: Dataset[_]): DataFrame = { +// println(s"select ${filterIndices.size} features: ${filterIndices.mkString(",")}") + filterIndices = selectedFeatures.take(${numTopFeatures}).sorted + + // select function, select the top features order by lasso coefficients + val select = udf { vector: Vector => + vector match { + // for DenseVector, just select top features + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until filterIndices(0)) values(i) = 0 + for (k <- 0 until filterIndices.size - 1) { + for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { + values(i) = 0 + } + } + for (i <- filterIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => filterIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } + } + dataset.withColumn($(outputCol), select(col($(featuresCol)))) + } + + + override def copy(extra: ParamMap): LassoSelectorModel = { + val copied = new LassoSelectorModel(uid, filterIndices) + copyValues(copied, extra).setParent(parent) + } +} + +object LassoSelectorModel extends MLReadable[LassoSelectorModel] { + + private[LassoSelectorModel] + class LassoSelectorModelWriter(instance: LassoSelectorModel) extends MLWriter { + + private case class Data(selectedFeatures: Seq[Int]) + + override protected def saveImpl(path: String): Unit = { + DefaultParamsWriter.saveMetadata(instance, path, sc) + val data = Data(instance.selectedFeatures.toSeq) + val dataPath = new Path(path, "data").toString + sparkSession.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath) + } + } + + private class LassoSelectorModelReader extends MLReader[LassoSelectorModel] { + + private val className = classOf[LassoSelectorModel].getName + + override def load(path: String): LassoSelectorModel = { + val metadata = DefaultParamsReader.loadMetadata(path, sc, className) + val data = sparkSession.read.parquet(path).select("selectedFeatures").head() + val selectedFeatures = data.getAs[Seq[Int]](0).toArray + val model = new LassoSelectorModel(metadata.uid, selectedFeatures) + DefaultParamsReader.getAndSetParams(model, metadata) + model + } + } + + override def read: MLReader[LassoSelectorModel] = new LassoSelectorModelReader + + override def load(path: String): LassoSelectorModel = super.load(path) +} + diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala new file mode 100644 index 000000000..9985337a9 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala @@ -0,0 +1,264 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package org.apache.spark.ml.feature.operator + +import breeze.linalg.{argsort, DenseVector => BDV} +import org.apache.hadoop.fs.Path +import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} +import org.apache.spark.ml.classification.RandomForestClassifier +import org.apache.spark.ml.feature.operator.RandomForestSelectorModel.RandomForestSelectorModelWriter +import org.apache.spark.ml.linalg.{DenseVector, SparseVector, Vector, VectorUDT, Vectors} +import org.apache.spark.ml.param.shared.{HasFeaturesCol, HasLabelCol, HasOutputCol} +import org.apache.spark.ml.param._ +import org.apache.spark.ml.util._ +import org.apache.spark.ml.{Estimator, Model} +import org.apache.spark.mllib.linalg.{Vector => OldVector, Vectors => OldVectors} +import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.functions.{col, udf} +import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.{DataFrame, Dataset, Row} + +/** + * Params for [[RandomForestSelector]] and [[RandomForestSelectorModel]]. + */ +private[feature] trait RandomForestSelectorParams extends Params + with HasFeaturesCol with HasOutputCol with HasLabelCol { + + /** + * Number of features that selector will select, ordered by descending feature importance. If the + * number of features is less than numTopFeatures, then this will select all features. + * Only applicable when selectorType = "numTopFeatures". + * The default value of numTopFeatures is 50. + * + * @group param + */ + final val numTopFeatures = new IntParam(this, "numTopFeatures", + "Number of features that selector will select, ordered by descending feature importance. If the" + + " number of features is < numTopFeatures, then this will select all features.", + ParamValidators.gtEq(1)) + setDefault(numTopFeatures -> 50) + + def getNumTopFeatures: Int = $(numTopFeatures) + + /** + * Percentile of features that selector will select, ordered by statistics value descending. + * Only applicable when selectorType = "percentile". + * Default value is 0.1. + * @group param + */ + final val percentile = new DoubleParam(this, "percentile", + "Percentile of features that selector will select, ordered by feature importance.", + ParamValidators.inRange(0, 1)) + setDefault(percentile -> 0.1) + + /** + * The selector type of the RandomForestSelector. + * Supported options: "numTopFeatures" (default), "percentile". + * @group param + */ + final val selectorType = new Param[String](this, "selectorType", + "The selector type of the ChisqSelector. " + + "Supported options: " + RandomForestSelector.supportedSelectorTypes.mkString(", "), + ParamValidators.inArray[String](RandomForestSelector.supportedSelectorTypes)) + setDefault(selectorType -> RandomForestSelector.NumTopFeatures) + + def getSelectorType: String = $(selectorType) +} + +/** + * RandomForest feature selection, which selects features with high feature impotrance. + * The selector supports different selection methods: `numTopFeatures`, `percentile`. + * - `numTopFeatures` chooses a fixed number of top features according to a chi-squared test. + * - `percentile` is similar but chooses a fraction of all features instead of a fixed number. + * By default, the selection method is `numTopFeatures`, with the default number of top features + * set to 50. + */ +class RandomForestSelector(override val uid: String) + extends Estimator[RandomForestSelectorModel] with RandomForestSelectorParams with DefaultParamsWritable { + + def this() = this(Identifiable.randomUID("randomForestSelector")) + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setLabelCol(value: String): this.type = set(labelCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + def setPercentile(value: Double): this.type = set(percentile, value) + + def setSelectorType(value: String): this.type = set(selectorType, value) + + override def fit(dataset: Dataset[_]): RandomForestSelectorModel = { + val rf = new RandomForestClassifier() + .setFeaturesCol(${featuresCol}) + .setLabelCol(${labelCol}) + + val rfModel = rf.fit(dataset) + + val featureImportances: Array[Double] = rfModel.featureImportances.toArray + + val sortedIndices: Array[Int] = argsort.argsortDenseVector_Double(BDV(featureImportances)).toArray.reverse + + new RandomForestSelectorModel(uid, sortedIndices) + .setFeaturesCol(${featuresCol}) + .setOutputCol(${outputCol}) + .setNumTopFeatures(${numTopFeatures}) + } + + override def transformSchema(schema: StructType): StructType = { + val otherPairs = RandomForestSelector.supportedSelectorTypes.filter(_ != $(selectorType)) + otherPairs.foreach { paramName: String => + if (isSet(getParam(paramName))) { + logWarning(s"Param $paramName will take no effect when selector type = ${$(selectorType)}.") + } + } + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + SchemaUtils.appendColumn(schema, $(outputCol), new VectorUDT) + } + + override def copy(extra: ParamMap): RandomForestSelector = defaultCopy(extra) +} + + +object RandomForestSelector extends DefaultParamsReadable[RandomForestSelector] { + + /** String name for `numTopFeatures` selector type. */ + private[spark] val NumTopFeatures: String = "numTopFeatures" + + /** String name for `percentile` selector type. */ + private[spark] val Percentile: String = "percentile" + + /** Set of selector types that ChiSqSelector supports. */ + val supportedSelectorTypes: Array[String] = Array(NumTopFeatures, Percentile) + + override def load(path: String): RandomForestSelector = super.load(path) +} + + +/** + * Model fitted by [[RandomForestSelector]]. + */ +class RandomForestSelectorModel(override val uid: String, + val selectedFeatures: Array[Int]) + extends Model[RandomForestSelectorModel] with RandomForestSelectorParams with MLWritable { + + private var filterIndices: Array[Int] = selectedFeatures.sorted + + def setFeaturesCol(value: String): this.type = set(featuresCol, value) + + def setOutputCol(value: String): this.type = set(outputCol, value) + + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + + override def transformSchema(schema: StructType): StructType = { + SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) + val newField = prepOutputField(schema) + val outputFields = schema.fields :+ newField + StructType(outputFields) + } + + /** + * Prepare the output column field, including per-feature metadata. + */ + private def prepOutputField(schema: StructType): StructField = { + val selector = selectedFeatures.toSet + val origAttrGroup = AttributeGroup.fromStructField(schema($(featuresCol))) + val featureAttributes: Array[Attribute] = if (origAttrGroup.attributes.nonEmpty) { + origAttrGroup.attributes.get.zipWithIndex.filter(x => selector.contains(x._2)).map(_._1) + } else { + Array.fill[Attribute](selector.size)(NominalAttribute.defaultAttr) + } + val newAttributeGroup = new AttributeGroup($(outputCol), featureAttributes) + newAttributeGroup.toStructField() + } + + override def transform(dataset: Dataset[_]): DataFrame = { + filterIndices = selectedFeatures.take(${numTopFeatures}).sorted +// println(s"select ${filterIndices.size} features: ${filterIndices.mkString(",")}") + + // select function, select the top features order by lasso coefficients + val select = udf { vector: Vector => + vector match { + // for DenseVector, just select top features + case dv: DenseVector => + val values: Array[Double] = dv.toArray + for (i <- 0 until filterIndices(0)) values(i) = 0 + for (k <- 0 until filterIndices.size - 1) { + for (i <- filterIndices(k) + 1 until filterIndices(k+1)) { + values(i) = 0 + } + } + for (i <- filterIndices.last + 1 until values.size) values(i) = 0 + Vectors.dense(values) + case sv: SparseVector => + val selectedPairs = sv.indices.zip(sv.values) + .filter{ case (k, v) => filterIndices.contains(k) } + Vectors.sparse(sv.size, selectedPairs.map(_._1), selectedPairs.map(_._2)) + case _ => + throw new IllegalArgumentException("Require DenseVector or SparseVector in spark.ml.linalg, but " + + vector.getClass.getSimpleName + " is given.") + } + } + dataset.withColumn($(outputCol), select(col($(featuresCol)))) + } + + override def copy(extra: ParamMap): RandomForestSelectorModel = { + val copied = new RandomForestSelectorModel(uid, filterIndices) + copyValues(copied, extra).setParent(parent) + } + + override def write: MLWriter = new RandomForestSelectorModelWriter(this) +} + + +object RandomForestSelectorModel extends MLReadable[RandomForestSelectorModel] { + + private[RandomForestSelectorModel] + class RandomForestSelectorModelWriter(instance: RandomForestSelectorModel) extends MLWriter { + + private case class Data(selectedFeatures: Seq[Int]) + + override protected def saveImpl(path: String): Unit = { + DefaultParamsWriter.saveMetadata(instance, path, sc) + val data = Data(instance.selectedFeatures.toSeq) + val dataPath = new Path(path, "data").toString + sparkSession.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath) + } + } + + private class RandomForestSelectorModelReader extends MLReader[RandomForestSelectorModel] { + + private val className = classOf[RandomForestSelectorModel].getName + + override def load(path: String): RandomForestSelectorModel = { + val metadata = DefaultParamsReader.loadMetadata(path, sc, className) + val data = sparkSession.read.parquet(path).select("selectedFeatures").head() + val selectedFeatures = data.getAs[Seq[Int]](0).toArray + val model = new RandomForestSelectorModel(metadata.uid, selectedFeatures) + DefaultParamsReader.getAndSetParams(model, metadata) + model + } + } + + override def read: MLReader[RandomForestSelectorModel] = new RandomForestSelectorModelReader + + override def load(path: String): RandomForestSelectorModel = super.load(path) +} \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala index c1b586708..17823018d 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VarianceSelector.scala @@ -119,6 +119,7 @@ class VarianceSelector(override val uid: String) new VarianceSelectorModel(uid, selectedIndices) .setFeaturesCol($(featuresCol)) .setOutputCol($(outputCol)) + .setNumTopFeatures(${numTopFeatures}) } override def transformSchema(schema: StructType): StructType = { @@ -158,12 +159,14 @@ class VarianceSelectorModel(override val uid: String, val selectedFeatures: Array[Int]) extends Model[VarianceSelectorModel] with VarianceSelectorParams with MLWritable { - private val filterIndices: Array[Int] = selectedFeatures.sorted + private var filterIndices: Array[Int] = selectedFeatures.sorted def setFeaturesCol(value: String): this.type = set(featuresCol, value) def setOutputCol(value: String): this.type = set(outputCol, value) + def setNumTopFeatures(value: Int): this.type = set(numTopFeatures, value) + override def transformSchema(schema: StructType): StructType = { SchemaUtils.checkColumnType(schema, $(featuresCol), new VectorUDT) val newField = prepOutputField(schema) @@ -187,6 +190,7 @@ class VarianceSelectorModel(override val uid: String, } override def transform(dataset: Dataset[_]): DataFrame = { + filterIndices = selectedFeatures.take(${numTopFeatures}).sorted // select function, select the top features order by lasso coefficients val select = udf { vector: Vector => vector match { diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala index 98a4e17c6..086d5a33c 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -1,17 +1,21 @@ package com.tencent.angel.spark.automl -import com.tencent.angel.spark.automl.feature.select.{LassoSelector, LassoSelectorModel, RandomForestSelector} +import java.io.{FileOutputStream, PrintStream} + import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NominalAttribute} import org.apache.spark.sql.SparkSession import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression} -import org.apache.spark.ml.feature.operator.VarianceSelector +import org.apache.spark.ml.feature.operator.{FtestSelector, LassoSelector, RandomForestSelector, VarianceSelector} import org.junit.Test class FeatureSelectorTest { val spark = SparkSession.builder().master("local").getOrCreate() + val numTopFeatures = 50 + @Test def testLasso(): Unit = { + System.setOut(new PrintStream(new FileOutputStream("lasso.out"))) val data = spark.read.format("libsvm") .option("numFeatures", "123") .load("../../data/a9a/a9a_123d_train_trans.libsvm") @@ -30,15 +34,13 @@ class FeatureSelectorTest { val selector = new LassoSelector() .setFeaturesCol("features") - .setLabelCol("label") .setOutputCol("selectedFeatures") - .setNumTopFeatures(50) + .setNumTopFeatures(numTopFeatures) - val selectedDF = selector.fit(data).transform(data) + val selectorModel = selector.fit(trainDF) - val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) - val selectedTrainDF = splitSelectedDF(0) - val selectedTestDF = splitSelectedDF(1) + val selectedTrainDF = selectorModel.transform(trainDF) + val selectedTestDF = selectorModel.transform(testDF) val selectedLR = new LogisticRegression() .setMaxIter(20) @@ -52,7 +54,7 @@ class FeatureSelectorTest { @Test def testRandomForest(): Unit = { - + System.setOut(new PrintStream(new FileOutputStream("rf.out"))) val data = spark.read.format("libsvm") .option("numFeatures", "123") .load("../../data/a9a/a9a_123d_train_trans.libsvm") @@ -71,15 +73,13 @@ class FeatureSelectorTest { val selector = new RandomForestSelector() .setFeaturesCol("features") - .setLabelCol("label") .setOutputCol("selectedFeatures") - .setNumTopFeatures(50) + .setNumTopFeatures(numTopFeatures) - val selectedDF = selector.fit(data).transform(data) + val selectorModel = selector.fit(trainDF) - val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) - val selectedTrainDF = splitSelectedDF(0) - val selectedTestDF = splitSelectedDF(1) + val selectedTrainDF = selectorModel.transform(trainDF) + val selectedTestDF = selectorModel.transform(testDF) val selectedLR = new LogisticRegression() .setMaxIter(20) @@ -93,7 +93,7 @@ class FeatureSelectorTest { @Test def testVariance(): Unit = { - + System.setOut(new PrintStream(new FileOutputStream("variance.out"))) val data = spark.read.format("libsvm") .option("numFeatures", "123") .load("../../data/a9a/a9a_123d_train_trans.libsvm") @@ -113,13 +113,52 @@ class FeatureSelectorTest { val selector = new VarianceSelector() .setFeaturesCol("features") .setOutputCol("selectedFeatures") - .setNumTopFeatures(500) + .setNumTopFeatures(numTopFeatures) + + val selectorModel = selector.fit(trainDF) + + val selectedTrainDF = selectorModel.transform(trainDF) + val selectedTestDF = selectorModel.transform(testDF) + + val selectedLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("selectedFeatures") + + val selectedAUC = selectedLR.fit(selectedTrainDF).evaluate(selectedTestDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"selected feature: auc = $selectedAUC") + + spark.stop() + } + + @Test + def testFtest(): Unit = { + System.setOut(new PrintStream(new FileOutputStream("ftest.out"))) + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .option("vectorType", "dense") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val splitData = data.randomSplit(Array(0.7, 0.3)) + val trainDF = splitData(0) + val testDF = splitData(1) + + val originalLR = new LogisticRegression() + .setMaxIter(20) + .setFeaturesCol("features") + + val originalAUC = originalLR.fit(trainDF).evaluate(testDF).asInstanceOf[BinaryLogisticRegressionSummary].areaUnderROC + println(s"original feature: auc = $originalAUC") + + val selector = new FtestSelector() + .setFeaturesCol("features") + .setOutputCol("selectedFeatures") + .setNumTopFeatures(numTopFeatures) - val selectedDF = selector.fit(data).transform(data) + val selectorModel = selector.fit(trainDF) - val splitSelectedDF = selectedDF.randomSplit(Array(0.7, 0.3)) - val selectedTrainDF = splitSelectedDF(0) - val selectedTestDF = splitSelectedDF(1) + val selectedTrainDF = selectorModel.transform(trainDF) + val selectedTestDF = selectorModel.transform(testDF) val selectedLR = new LogisticRegression() .setMaxIter(20) From cca74194ac26dad05f32f829fe37015f1f76bb0c Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Tue, 9 Apr 2019 22:37:14 +0200 Subject: [PATCH 103/115] handle not converge exception --- .../spark/automl/tuner/model/GPModel.scala | 44 ++++++++++++++++--- .../automl/tuner/surrogate/GPSurrogate.scala | 9 +++- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 67b743bfd..58b79a4c8 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -18,8 +18,9 @@ package com.tencent.angel.spark.automl.tuner.model -import breeze.linalg.{cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} -import breeze.optimize.LBFGS +import breeze.linalg.{Axis, cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} +import breeze.optimize.StochasticGradientDescent.SimpleSGD +import breeze.optimize.{AdaDeltaGradientDescent, LBFGS, StochasticGradientDescent} import com.tencent.angel.spark.automl.tuner.kernel.{Covariance, CovarianceType} import com.tencent.angel.spark.automl.tuner.math.BreezeOp @@ -36,9 +37,11 @@ class GPModel(val covFunc: Covariance, var L: BDM[Double] = _ def fit(newX: BDM[Double], - newy: BDV[Double]): this.type = { + newy: BDV[Double]): Boolean = { require(newX.rows == newy.length, "incompatible size of the input X and y") + var trainSuccess = true + if ((X == null && y == null) || (newX.rows > X.rows && newy.length > y.length)) { X = newX @@ -47,11 +50,28 @@ class GPModel(val covFunc: Covariance, val kernelDiffFunc = new GPKernelDiffFunc(this) val initParams = BDV(covParams.toArray :+ noiseStdDev) + //println(s"init params: ${initParams}") + + //val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 7, tolerance = 1e-10) + val optimizer = new SimpleSGD[BDV[Double]](1, 10) + var newParams = initParams + try { + newParams = optimizer.minimize(kernelDiffFunc, initParams) + } catch { + case e: breeze.linalg.NotConvergedException => + println(s"Breeze Not Converged Exception") + newParams = initParams + } - val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 7, tolerance = 1e-10) - val newParams = optimizer.minimize(kernelDiffFunc, initParams) //println(optimizer) - //println(s"new params: ${newParams}") + println(s"new params: ${newParams}") + if(!checkParam(newParams)) { + newParams = initParams + println(s"reset to init params: ${newParams}") + trainSuccess = false + X.delete(X.rows - 1, Axis._0) + y = y.slice(0, y.length - 1) + } val newCovParams = BDV(newParams.toArray.dropRight(1)) val newNoiseStdDev = newParams.toArray.last @@ -59,7 +79,17 @@ class GPModel(val covFunc: Covariance, this.covParams = newCovParams this.noiseStdDev = newNoiseStdDev - this + trainSuccess + } + + def checkParam(params: BDV[Double]): Boolean = { + var isValid = true + params.values.foreach{ param: Double => + //println(s"$param") + if(param.isNaN || param.isInfinity) + isValid = false + } + isValid } def update(newX: BDM[Double], diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala index b7c5d763b..d80f313d1 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala @@ -44,7 +44,14 @@ class GPSurrogate( override def train(): Unit = { val breezeX: BDM[Double] = DataUtils.toBreeze(preX.toArray) val breezeY: BDV[Double] = DataUtils.toBreeze(preY.toArray) - gpModel.fit(breezeX, breezeY) + val success = gpModel.fit(breezeX, breezeY) + if(!success) { + println(s"number of history before drop: ${preX.length}") + preX.remove(preX.length - 1) + preY.remove(preY.length - 1) + println(s"number of history after drop: ${preX.length}") + println(s"drop this configuration owing to convergence failure.") + } /*println("Fitted covariance function params:") println(gpModel.covParams) From 2452dbdcb255a97e5558b1edb8e4349602b1080d Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 11 Apr 2019 13:14:47 +0200 Subject: [PATCH 104/115] fix convergence failure in GP EM algorithm --- .../automl/tuner/model/GPKernelDiffFunc.scala | 6 ++- .../spark/automl/tuner/model/GPModel.scala | 38 +++++++++++-------- .../automl/tuner/surrogate/GPSurrogate.scala | 4 +- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala index aabf2e790..33e73d5e7 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPKernelDiffFunc.scala @@ -72,11 +72,13 @@ class GPKernelDiffFunc(model: GPModel) extends DiffFunction[BDV[Double]] { (loglikeLoss, loglikeGrads) } catch { case e: NotConvergedException => - println(s"not converge exception $e") - (Double.NaN, BDV.zeros[Double](params.size) * Double.NaN) + //println(s"not converge exception $e") + //(Double.NaN, BDV.zeros[Double](params.size) * Double.NaN) + throw e case e: MatrixNotSymmetricException => println(s"matrix not symmetric exception $e") (Double.NaN, BDV.zeros[Double](params.size) * Double.NaN) + throw e } } } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index 58b79a4c8..b452259fd 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -18,7 +18,7 @@ package com.tencent.angel.spark.automl.tuner.model -import breeze.linalg.{Axis, cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} +import breeze.linalg.{Axis, MatrixNotSymmetricException, cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} import breeze.optimize.StochasticGradientDescent.SimpleSGD import breeze.optimize.{AdaDeltaGradientDescent, LBFGS, StochasticGradientDescent} import com.tencent.angel.spark.automl.tuner.kernel.{Covariance, CovarianceType} @@ -36,6 +36,10 @@ class GPModel(val covFunc: Covariance, var KXX: BDM[Double] = _ var L: BDM[Double] = _ + def remove(idx: Int): Unit = { + X + } + def fit(newX: BDM[Double], newy: BDV[Double]): Boolean = { require(newX.rows == newy.length, "incompatible size of the input X and y") @@ -52,26 +56,31 @@ class GPModel(val covFunc: Covariance, val initParams = BDV(covParams.toArray :+ noiseStdDev) //println(s"init params: ${initParams}") - //val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 7, tolerance = 1e-10) - val optimizer = new SimpleSGD[BDV[Double]](1, 10) var newParams = initParams + val optimizer = new LBFGS[BDV[Double]](maxIter = 10, m = 7, tolerance = 1e-10) + //val optimizer = new SimpleSGD[BDV[Double]](1, 10) try { newParams = optimizer.minimize(kernelDiffFunc, initParams) } catch { - case e: breeze.linalg.NotConvergedException => - println(s"Breeze Not Converged Exception") + case _: breeze.linalg.NotConvergedException | _ : MatrixNotSymmetricException => + //println(s"Breeze Not Converged Exception") newParams = initParams + trainSuccess = false + X = X.delete(X.rows - 1, Axis._0) + y = y.slice(0, y.length - 1) } - //println(optimizer) - println(s"new params: ${newParams}") - if(!checkParam(newParams)) { - newParams = initParams - println(s"reset to init params: ${newParams}") - trainSuccess = false - X.delete(X.rows - 1, Axis._0) - y = y.slice(0, y.length - 1) - } +// println(optimizer) +// println(s"new params: ${newParams}") +// if(!checkParam(newParams)) { +// newParams = initParams +// println(s"reset to init params: ${newParams}") +// trainSuccess = false +// println(s"history size: ${X.rows} ${y.length}") +// X = X.delete(X.rows - 1, Axis._0) +// y = y.slice(0, y.length - 1) +// println(s"history size: ${X.rows} ${y.length}") +// } val newCovParams = BDV(newParams.toArray.dropRight(1)) val newNoiseStdDev = newParams.toArray.last @@ -85,7 +94,6 @@ class GPModel(val covFunc: Covariance, def checkParam(params: BDV[Double]): Boolean = { var isValid = true params.values.foreach{ param: Double => - //println(s"$param") if(param.isNaN || param.isInfinity) isValid = false } diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala index d80f313d1..3f0041753 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/surrogate/GPSurrogate.scala @@ -46,11 +46,9 @@ class GPSurrogate( val breezeY: BDV[Double] = DataUtils.toBreeze(preY.toArray) val success = gpModel.fit(breezeX, breezeY) if(!success) { - println(s"number of history before drop: ${preX.length}") preX.remove(preX.length - 1) preY.remove(preY.length - 1) - println(s"number of history after drop: ${preX.length}") - println(s"drop this configuration owing to convergence failure.") + println(s"drop the new configuration owing to convergence failure.") } /*println("Fitted covariance function params:") From 1294506df0569c3cdf5418356cfbcd331b1c4b56 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 11 Apr 2019 13:19:09 +0200 Subject: [PATCH 105/115] change log --- .../tencent/angel/spark/automl/tuner/solver/Solver.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index efba1445a..6e829cc78 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -83,11 +83,12 @@ class Solver( surrogateMode match { case SurrogateMode.GP | SurrogateMode.RF => val acqAndConfig = optimizer.maximize(TunerParam.batchSize) - println(s"suggest configurations:") + print(s"suggest configurations: ") acqAndConfig.foreach { case (acq, config) => - println(s"config[${config.getVector.toArray.mkString("(", ",", ")")}], " + - s"acquisition[$acq]") + print(s">> config[${config.getVector.toArray.mkString("(", ",", ")")}], " + + s"acquisition[$acq] << ") } + println() acqAndConfig.map(_._2) case SurrogateMode.RANDOM => cs.randomSample(TunerParam.batchSize) From 27211afbfeb534ea854649bcde691c2c076982c7 Mon Sep 17 00:00:00 2001 From: xuehuanran <935254102@qq.com> Date: Wed, 15 May 2019 21:50:38 +0800 Subject: [PATCH 106/115] 1 add the PipelineWrapperModel in the PileWrapper to drop Intermediate dataframe 2 complete the basic structure of recording the derivation information of cross-features --- .../spark/automl/feature/PipelineDriver.scala | 2 +- .../automl/feature/PipelineWrapper.scala | 49 +++++++- .../operator/MetadataTransformUtils.scala | 113 ++++++++++++++++++ .../operator/RandomForestSelector.scala | 9 +- .../ml/feature/operator/VectorCartesian.scala | 13 +- .../spark/automl/FeatureSelectorTest.scala | 2 + .../angel/spark/automl/MetadataTest.scala | 93 ++++++++++++++ 7 files changed, 272 insertions(+), 9 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/MetadataTransformUtils.scala create mode 100644 spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/MetadataTest.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala index 59bf9740b..262f2e5b4 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineDriver.scala @@ -38,7 +38,7 @@ object PipelineDriver { pipelineWrapper.setStages(stages) - val model: PipelineModel = pipelineWrapper.fit(inputDF) + val model: PipelineModelWrapper = pipelineWrapper.fit(inputDF) val outDF = model.transform(inputDF) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala index 19ff7df38..cea918af1 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/feature/PipelineWrapper.scala @@ -1,18 +1,61 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + package com.tencent.angel.spark.automl.feature import org.apache.spark.ml.{Pipeline, PipelineModel, PipelineStage} -import org.apache.spark.sql.Dataset +import org.apache.spark.sql.{DataFrame, Dataset} class PipelineWrapper() { var pipeline = new Pipeline() + var transformers: Array[TransformerWrapper] = Array() + + def setTransformers(value: Array[TransformerWrapper]): this.type = { + transformers = value + setStages(PipelineBuilder.build(transformers)) + this + } + def setStages(value: Array[_ <: PipelineStage]): Unit = { pipeline = pipeline.setStages(value) } - def fit(dataset: Dataset[_]): PipelineModel = { - pipeline.fit(dataset) + def fit(dataset: Dataset[_]): PipelineModelWrapper = { + new PipelineModelWrapper(pipeline.fit(dataset), transformers) } } + +class PipelineModelWrapper(val model: PipelineModel, + val transformers: Array[TransformerWrapper]) { + + def transform(dataset: Dataset[_]): DataFrame = { + var df = model.transform(dataset) + if (transformers.length >= 2) { + (0 until transformers.length - 1).foreach{ i => + val outCols = transformers(i).getOutputCols + for (col <- outCols) { + df = df.drop(col) + } + } + } + df + } +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/MetadataTransformUtils.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/MetadataTransformUtils.scala new file mode 100644 index 000000000..452646887 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/MetadataTransformUtils.scala @@ -0,0 +1,113 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package org.apache.spark.ml.feature.operator + +import org.apache.spark.sql.types.{MetadataBuilder, StructField} +import org.apache.spark.sql.{DataFrame, Dataset} + +import scala.collection.mutable.ArrayBuffer + +/** + * The factory to record the generation information for each feature in the pipeline + */ +object MetadataTransformUtils { + + final val DERIVATION: String = "derivation" + + /** + * Check and initialization. + * @param numFeatures: the number of features + * @return + */ + private def createDerivation(numFeatures: Int): Array[String] = { + val arrayBuffer = ArrayBuffer[String]() + (0 until numFeatures).foreach{ i => + arrayBuffer.append("f_" + i.toString) + } + arrayBuffer.toArray + } + + /** + * + * @param feature1 + * @param feature2 + * @return Array[String] + */ + private def cartesianWithArray(feature1: Array[String], feature2: Array[String]): Array[String] = { + val res = ArrayBuffer[String]() + feature1.foreach{ f1 => + feature2.foreach{ f2 => + res.append("(" + f1 + " x " + f2 + ")") + } + } + res.toArray + } + + /** + * + * @param field + * @param filterIndices + * @param numFeatures + * @return + */ + def featureSelectionTransform(field: StructField, // Metadata is private[types] + filterIndices: Array[Int], + numFeatures: Int): MetadataBuilder = { + val metadata = field.metadata + + var derivation = Array[String]() + if (metadata.contains(DERIVATION)) { + derivation = filterIndices map metadata.getStringArray(DERIVATION) + } else { + derivation = createDerivation(numFeatures) + } + + new MetadataBuilder().withMetadata(metadata).putStringArray(DERIVATION, derivation) + } + + /** + * + * @param fields: The Array[StructField] + * @param numFeatures number of features + * @return + */ + def vectorCartesianTransform(fields: Array[StructField], numFeatures: Int): MetadataBuilder = { + if (fields.length < 2) { + throw new IllegalArgumentException("the number of cols in the input DataFrame should be no less than 2") + } + + var res = Array[String]() + if (fields.head.metadata.contains(DERIVATION)) { + res = fields.head.metadata.getStringArray(DERIVATION) + } else { + res = createDerivation(numFeatures) + } + + for (i <- 1 until fields.length) { + if (fields(i).metadata.contains(DERIVATION)) { + res = cartesianWithArray(res, fields(i).metadata.getStringArray(DERIVATION)) + } else { + res = cartesianWithArray(res, createDerivation(numFeatures)) + } + } + + val metadata = fields.last.metadata + new MetadataBuilder().withMetadata(metadata).putStringArray(DERIVATION, res) + } + +} diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala index 9985337a9..478516926 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/RandomForestSelector.scala @@ -31,7 +31,7 @@ import org.apache.spark.mllib.linalg.{Vector => OldVector, Vectors => OldVectors import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} import org.apache.spark.rdd.RDD import org.apache.spark.sql.functions.{col, udf} -import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.types.{MetadataBuilder, StructField, StructType} import org.apache.spark.sql.{DataFrame, Dataset, Row} /** @@ -217,7 +217,12 @@ class RandomForestSelectorModel(override val uid: String, + vector.getClass.getSimpleName + " is given.") } } - dataset.withColumn($(outputCol), select(col($(featuresCol)))) + + dataset.withColumn( + $(outputCol), + select(col($(featuresCol))), + MetadataTransformUtils.featureSelectionTransform( + dataset.select(${featuresCol}).schema.fields.last, filterIndices, selectedFeatures.length).build()) } override def copy(extra: ParamMap): RandomForestSelectorModel = { diff --git a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala index e990b8230..7f298b2a7 100644 --- a/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala +++ b/spark-on-angel/automl/src/main/scala/org/apache/spark/ml/feature/operator/VectorCartesian.scala @@ -89,9 +89,16 @@ class VectorCartesian (override val uid: String) extends Transformer val featureCols = inputFeatures.map { f => dataset(f.name) } - dataset.select( - col("*"), - interactFunc(struct(featureCols: _*)).as($(outputCol), featureAttrs.toMetadata())) + val fields: Array[StructField] = $(inputCols).map(inputCol => dataset.select(inputCol).schema.fields.last) +// dataset.select( +// col("*"), +// interactFunc(struct(featureCols: _*)).as($(outputCol), featureAttrs.toMetadata())) + + dataset.select(col("*"), + interactFunc(struct(featureCols: _*)).as( + $(outputCol), + MetadataTransformUtils.vectorCartesianTransform(fields, vectorDims(0)).build())) + } private def getVectorDimension(dataset: Dataset[_], cols: Array[String]): Array[Int] = { diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala index 086d5a33c..797410445 100644 --- a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/FeatureSelectorTest.scala @@ -81,6 +81,8 @@ class FeatureSelectorTest { val selectedTrainDF = selectorModel.transform(trainDF) val selectedTestDF = selectorModel.transform(testDF) + selectedTestDF.select("selectedFeatures").schema.fields.foreach(f => println(f.metadata.toString())) + val selectedLR = new LogisticRegression() .setMaxIter(20) .setFeaturesCol("selectedFeatures") diff --git a/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/MetadataTest.scala b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/MetadataTest.scala new file mode 100644 index 000000000..cadf20ed0 --- /dev/null +++ b/spark-on-angel/automl/src/test/scala/com/tencent/angel/spark/automl/MetadataTest.scala @@ -0,0 +1,93 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl + +import org.apache.spark.ml.Pipeline +import org.apache.spark.ml.feature.VectorAssembler +import org.apache.spark.ml.feature.operator.{MetadataTransformUtils, VectorCartesian} +import org.apache.spark.sql.SparkSession +import org.junit.Test + +class MetadataTest { + + val spark = SparkSession.builder().master("local").getOrCreate() + + @Test + def testVectorCartesian(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", "123") + .load("../../data/a9a/a9a_123d_train_trans.libsvm") + .persist() + + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("cartesian_features") + + val assembler = new VectorAssembler() + .setInputCols(Array("features", "cartesian_features")) + .setOutputCol("assemble_features") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, assembler)) + + val featureModel = pipeline.fit(data) + val crossDF = featureModel.transform(data) + + crossDF.schema.fields.foreach{ field => + println("name: " + field.name) + println("metadata: " + field.metadata.toString()) + } + + spark.close() + + } + + @Test + def testThreeOrderCartesian(): Unit = { + val data = spark.read.format("libsvm") + .option("numFeatures", 8) + .load("../../data/abalone/abalone_8d_train.libsvm") + .persist() + + val cartesian = new VectorCartesian() + .setInputCols(Array("features", "features")) + .setOutputCol("f_f") + + val cartesian2 = new VectorCartesian() + .setInputCols(Array("features", "f_f")) + .setOutputCol("f_f_f") + + val pipeline = new Pipeline() + .setStages(Array(cartesian, cartesian2)) + + val crossDF = pipeline.fit(data).transform(data).persist() + + // first cartesian, the number of dimensions is 64 + println(crossDF.select("f_f").schema.fields.last.metadata.getStringArray(MetadataTransformUtils.DERIVATION).length) + // second cartesian, the number of dimensions is 512 + println(crossDF.select("f_f_f").schema.fields.last.metadata.getStringArray(MetadataTransformUtils.DERIVATION).length) + + + crossDF.select("f_f").schema.fields.last.metadata.getStringArray(MetadataTransformUtils.DERIVATION).foreach(str => println(str + ", ")) + println() + crossDF.select("f_f_f").schema.fields.last.metadata.getStringArray(MetadataTransformUtils.DERIVATION).foreach(str => println(str + ", ")) + + spark.close() + } + +} From df62b5315db8ede7c9380a946c489c104c841fce Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 16 May 2019 19:20:40 +0200 Subject: [PATCH 107/115] change spark version, auto offline learner and runner --- .../tencent/angel/ml/core/conf/MLConf.scala | 8 +++ angel-ps/pom.xml | 2 +- pom.xml | 2 +- spark-on-angel/automl/pom.xml | 7 +- .../examples/automl/RFTunerExample.scala | 4 +- .../examples/cluster/AutoOfflineRunner.scala | 72 +++++++++++++++++++ .../examples/cluster/OfflineRunner.scala | 2 +- spark-on-angel/mllib/pom.xml | 2 +- .../spark/ml/core/AutoOfflineLearner.scala | 12 ++-- .../tencent/angel/spark/ml/AutoFMTest.scala | 69 ++++++++++++++++++ ...{AutoLRTestGP.scala => AutoGPLRTest.scala} | 8 ++- ...oLRTestGrid.scala => AutoGridLRTest.scala} | 2 +- ...estRandom.scala => AutoRandomLRTest.scala} | 2 +- spark-on-angel/pom.xml | 2 +- 14 files changed, 176 insertions(+), 18 deletions(-) create mode 100644 spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTestGP.scala => AutoGPLRTest.scala} (84%) rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTestGrid.scala => AutoGridLRTest.scala} (96%) rename spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/{AutoLRTestRandom.scala => AutoRandomLRTest.scala} (96%) diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 4f48f99b6..b88773f1b 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -198,6 +198,14 @@ object MLConf { val ML_TREE_AGGRE_MAX_MEMORY_MB = "ml.tree.aggr.max.memory.mb" val DEFAULT_ML_TREE_AGGRE_MAX_MEMORY_MB = 256 + // AutoML params + val ML_AUTO_TUNER_ITER = "ml.auto.tuner.iter" + val DEFAULT_ML_AUTO_TUNER_ITER = 10 + val ML_AUTO_TUNER_MODEL = "ml.auto.tuner.model" + val DEFAULT_ML_AUTO_TUNER_MODEL = "GaussianProcess" + val ML_AUTO_TUNER_MINIMIZE = "ml.auto.tuner.minimize" + val DEFAULT_ML_AUTO_TUNER_MINIMIZE = false + /** The loss sum of all samples */ val TRAIN_LOSS = "train.loss" val VALID_LOSS = "validate.loss" diff --git a/angel-ps/pom.xml b/angel-ps/pom.xml index ac03e4f3a..0eb0641cd 100644 --- a/angel-ps/pom.xml +++ b/angel-ps/pom.xml @@ -41,7 +41,7 @@ ${project.parent.basedir} provided - 2.1.0 + 2.2.0 diff --git a/pom.xml b/pom.xml index 0f11535c9..4203cccd4 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 2.0.0 angel - 2.2.0 + 2.7.3 2.5.0 1.8 2.11 diff --git a/spark-on-angel/automl/pom.xml b/spark-on-angel/automl/pom.xml index 539dc485c..437f9717b 100644 --- a/spark-on-angel/automl/pom.xml +++ b/spark-on-angel/automl/pom.xml @@ -14,12 +14,17 @@ spark-on-angel-automl - 2.2.0 + 2.7.3 ${project.parent.parent.basedir} + + junit + junit + 4.11 + org.apache.hadoop hadoop-common diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala index 9904995a6..4bf6ebb4c 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/RFTunerExample.scala @@ -23,7 +23,7 @@ import com.tencent.angel.spark.automl.tuner.acquisition.{Acquisition, EI} import com.tencent.angel.spark.automl.tuner.config.ConfigurationSpace import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.automl.tuner.solver.{Solver, SolverWithTrail} -import com.tencent.angel.spark.automl.tuner.surrogate.{RFSurrogate, Surrogate} +import com.tencent.angel.spark.automl.tuner.surrogate.{RFSurrogate, Surrogate, SurrogateMode} import com.tencent.angel.spark.automl.tuner.trail.{TestTrail, Trail} import org.apache.spark.ml.linalg.Vector @@ -42,7 +42,7 @@ object RFTunerExample extends App { val sur: Surrogate = new RFSurrogate(cs, true) val acq: Acquisition = new EI(sur, 0.1f) val opt: AcqOptimizer = new RandomSearch(acq, cs) - val solver: Solver = new Solver(cs, sur, acq, opt) + val solver: Solver = new Solver(cs, sur, acq, opt, SurrogateMode.RF) val trail: Trail = new TestTrail() val runner: SolverWithTrail = new SolverWithTrail(solver, trail) val result: (Vector, Double) = runner.run(10) diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala new file mode 100644 index 000000000..e99a0848f --- /dev/null +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala @@ -0,0 +1,72 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.examples.cluster + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.spark.context.PSContext +import com.tencent.angel.spark.ml.core.{ArgsUtil, AutoOfflineLearner, GraphModel, OfflineLearner} +import org.apache.spark.{SparkConf, SparkContext} + +object AutoOfflineRunner { + + def main(args: Array[String]): Unit = { + val params = ArgsUtil.parse(args) + + val input = params.getOrElse("input", "") + val output = params.getOrElse("output", "") + val actionType = params.getOrElse("actionType", "train") + val network = params.getOrElse("network", "LogisticRegression") + val modelPath = params.getOrElse("model", "") + + // set running mode, use angel_ps mode for spark + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + // build SharedConf with params + SharedConf.addMap(params) + + val dim = SharedConf.indexRange.toInt + + println(s"dim=$dim") + + // load data + val conf = new SparkConf() + + // we set the load model path for angel-ps to load the meta information of model + if (modelPath.length > 0) + conf.set(AngelConf.ANGEL_LOAD_MODEL_PATH, modelPath) + + val sc = new SparkContext(conf) + + // start PS + PSContext.getOrCreate(sc) + + val className = "com.tencent.angel.spark.ml.classification." + network + val model = GraphModel(className) + + val learner = new AutoOfflineLearner + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") + + actionType match { + case MLConf.ANGEL_ML_TRAIN => learner.train(input, output, modelPath, dim, model) + case MLConf.ANGEL_ML_PREDICT => learner.predict(input, output, modelPath, dim, model) + } + } +} + diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/OfflineRunner.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/OfflineRunner.scala index c7cc1deb4..bbc86f60f 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/OfflineRunner.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/OfflineRunner.scala @@ -53,7 +53,7 @@ object OfflineRunner { if (modelPath.length > 0) conf.set(AngelConf.ANGEL_LOAD_MODEL_PATH, modelPath) - val sc = new SparkContext(conf) + val sc = new SparkContext(conf) // start PS PSContext.getOrCreate(sc) diff --git a/spark-on-angel/mllib/pom.xml b/spark-on-angel/mllib/pom.xml index 6f7fdae89..04cca6a67 100644 --- a/spark-on-angel/mllib/pom.xml +++ b/spark-on-angel/mllib/pom.xml @@ -7,7 +7,7 @@ com.tencent.angel spark-on-angel - 2.0.0 + 2.0.0 ../pom.xml diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index ee1b29e97..162c2700c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -37,14 +37,15 @@ import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner(var tuneIter: Int = 20, minimize: Boolean = true,surrogate: String="GP") { +class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, var surrogate: String = "GaussianProcess") { // Shared configuration with Angel-PS val conf = SharedConf.get() - if(surrogate=="Grid"){ - tuneIter = 1 - } + // set tuner params + tuneIter = conf.getInt(MLConf.ML_AUTO_TUNER_ITER, MLConf.DEFAULT_ML_AUTO_TUNER_ITER) + minimize = conf.getBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, MLConf.DEFAULT_ML_AUTO_TUNER_MINIMIZE) + surrogate = conf.get(MLConf.ML_AUTO_TUNER_MODEL, MLConf.DEFAULT_ML_AUTO_TUNER_MODEL) // Some params var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) @@ -53,9 +54,8 @@ class AutoOfflineLearner(var tuneIter: Int = 20, minimize: Boolean = true,surrog println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - val solver: Solver = Solver(cs, minimize,surrogate) + val solver: Solver = Solver(cs, minimize, surrogate) // param name -> param type (continuous or discrete), value type (int, double,...) val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala new file mode 100644 index 000000000..3772d4c77 --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala @@ -0,0 +1,69 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.ml + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.ml.matrix.RowType +import com.tencent.angel.spark.ml.classification.FactorizationMachine +import com.tencent.angel.spark.ml.core.{AutoOfflineLearner, OfflineLearner} + +class AutoFMTest extends PSFunSuite with SharedPSContext { + + private var learner: AutoOfflineLearner = _ + private var input: String = _ + private var dim: Int = _ + + override def beforeAll(): Unit = { + super.beforeAll() + + input = "../data/census/census_148d_train.libsvm" + + // build SharedConf with params + SharedConf.get() + SharedConf.get().set(MLConf.ML_MODEL_TYPE, RowType.T_FLOAT_DENSE.toString) + SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) + SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) + SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 20) + SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) + SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) + SharedConf.get().setDouble(MLConf.ML_BATCH_SAMPLE_RATIO, 0.2) + dim = SharedConf.indexRange.toInt + + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) + SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) + SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") + + learner = new AutoOfflineLearner + learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") + } + + override def afterAll(): Unit = { + super.afterAll() + } + + test("FactorizationMachine") { + val model = new FactorizationMachine + learner.train(input, "", "", dim, model) + } + +} diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala similarity index 84% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala index f974c94db..405734fca 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGP.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTestGP extends PSFunSuite with SharedPSContext { +class AutoGPLRTest extends PSFunSuite with SharedPSContext { private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ @@ -33,7 +33,11 @@ class AutoLRTestGP extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(25,false) + SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) + SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) + SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") + + learner = new AutoOfflineLearner learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") } diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala similarity index 96% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala index f8c2d0200..9bc64b5df 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestGrid.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTestGrid extends PSFunSuite with SharedPSContext { +class AutoGridLRTest extends PSFunSuite with SharedPSContext { private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala similarity index 96% rename from spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala rename to spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala index 40db4e600..22165ebdd 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoLRTestRandom.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala @@ -7,7 +7,7 @@ import com.tencent.angel.ml.matrix.RowType import com.tencent.angel.spark.ml.classification.LogisticRegression import com.tencent.angel.spark.ml.core.AutoOfflineLearner -class AutoLRTestRandom extends PSFunSuite with SharedPSContext { +class AutoRandomLRTest extends PSFunSuite with SharedPSContext { private var learner: AutoOfflineLearner = _ private var input: String = _ private var dim: Int = _ diff --git a/spark-on-angel/pom.xml b/spark-on-angel/pom.xml index ce4cfedc4..b6119f171 100644 --- a/spark-on-angel/pom.xml +++ b/spark-on-angel/pom.xml @@ -38,7 +38,7 @@ - 2.1.0 + 2.2.0 512m 512m 1024m From 2339790f35d35833a292881e6c0c6d80d8e6fd7b Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sun, 19 May 2019 13:08:07 +0200 Subject: [PATCH 108/115] change scope of lib for automl --- spark-on-angel/automl/pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spark-on-angel/automl/pom.xml b/spark-on-angel/automl/pom.xml index 437f9717b..9416d79ef 100644 --- a/spark-on-angel/automl/pom.xml +++ b/spark-on-angel/automl/pom.xml @@ -29,31 +29,43 @@ org.apache.hadoop hadoop-common ${hadoop.version} + test-jar + test org.apache.hadoop hadoop-client ${hadoop.version} + test-jar + test org.apache.hadoop hadoop-hdfs ${hadoop.version} + test-jar + test org.apache.spark spark-core_${scala.binary.version} ${spark.version} + test-jar + test org.apache.spark spark-mllib_${scala.binary.version} ${spark.version} + test-jar + test org.apache.spark spark-sql_${scala.binary.version} ${spark.version} + test-jar + test From 00f7a0d1dec190145e7b237f6ecdb08c86d5ac93 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Mon, 20 May 2019 11:04:15 +0200 Subject: [PATCH 109/115] integration of Angel and auto tuning --- angel-ps/pom.xml | 2 +- spark-on-angel/automl/pom.xml | 42 +++++++++++-------- .../spark/automl/tuner/model/GPModel.scala | 1 - .../spark/automl/tuner/solver/Solver.scala | 4 +- .../spark/ml/core/AutoOfflineLearner.scala | 2 +- .../tencent/angel/spark/ml/AutoGPLRTest.scala | 2 +- spark-on-angel/pom.xml | 2 +- 7 files changed, 31 insertions(+), 24 deletions(-) diff --git a/angel-ps/pom.xml b/angel-ps/pom.xml index 0eb0641cd..ac03e4f3a 100644 --- a/angel-ps/pom.xml +++ b/angel-ps/pom.xml @@ -41,7 +41,7 @@ ${project.parent.basedir} provided - 2.2.0 + 2.1.0 diff --git a/spark-on-angel/automl/pom.xml b/spark-on-angel/automl/pom.xml index 9416d79ef..eb6c3d201 100644 --- a/spark-on-angel/automl/pom.xml +++ b/spark-on-angel/automl/pom.xml @@ -14,8 +14,6 @@ spark-on-angel-automl - - 2.7.3 ${project.parent.parent.basedir} @@ -25,48 +23,58 @@ junit 4.11 + + org.scalanlp + breeze_2.11 + 0.13 + org.apache.hadoop hadoop-common - ${hadoop.version} - test-jar - test + ${hadoop-version} org.apache.hadoop hadoop-client - ${hadoop.version} - test-jar - test + ${hadoop-version} org.apache.hadoop hadoop-hdfs - ${hadoop.version} - test-jar - test + ${hadoop-version} org.apache.spark spark-core_${scala.binary.version} ${spark.version} - test-jar - test org.apache.spark spark-mllib_${scala.binary.version} ${spark.version} - test-jar - test org.apache.spark spark-sql_${scala.binary.version} ${spark.version} - test-jar - test + + + + maven-jar-plugin + + + angel + + jar + + package + + + + + + \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala index b452259fd..a0f04c4f0 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/model/GPModel.scala @@ -19,7 +19,6 @@ package com.tencent.angel.spark.automl.tuner.model import breeze.linalg.{Axis, MatrixNotSymmetricException, cholesky, diag, DenseMatrix => BDM, DenseVector => BDV} -import breeze.optimize.StochasticGradientDescent.SimpleSGD import breeze.optimize.{AdaDeltaGradientDescent, LBFGS, StochasticGradientDescent} import com.tencent.angel.spark.automl.tuner.kernel.{Covariance, CovarianceType} import com.tencent.angel.spark.automl.tuner.math.BreezeOp diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index 6e829cc78..a3095f73e 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -57,7 +57,7 @@ class Solver( cs.addParam(param) } - def addParam(pType: String, vType: String, name: String, config: String, seed: Int = 100): Unit = { + def addParam(pType: String, vType: String, name: String, config: String, seed: Int): Unit = { pType.toLowerCase match { case "discrete" => vType.toLowerCase match { @@ -143,7 +143,7 @@ object Solver { new Solver(cs, sur, acq, opt, SurrogateMode.GP) } - def apply(cs: ConfigurationSpace, minimize: Boolean = true, surrogate: String): Solver = { + def apply(cs: ConfigurationSpace, minimize: Boolean, surrogate: String): Solver = { val mode = SurrogateMode.fromString(surrogate) mode match { case SurrogateMode.GP => diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 162c2700c..765abafa4 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -65,7 +65,7 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v this } - def addParam(pType: String, vType: String, name: String, config: String, seed:Int = 100): this.type = { + def addParam(pType: String, vType: String, name: String, config: String, seed: Int = 100): this.type = { paramType += name -> (pType.toLowerCase, vType.toLowerCase) solver.addParam(pType, vType, name, config, seed) this diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala index 405734fca..75912b6d4 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala @@ -24,7 +24,7 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") - SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 10) SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) diff --git a/spark-on-angel/pom.xml b/spark-on-angel/pom.xml index b6119f171..ce4cfedc4 100644 --- a/spark-on-angel/pom.xml +++ b/spark-on-angel/pom.xml @@ -38,7 +38,7 @@ - 2.2.0 + 2.1.0 512m 512m 1024m From 6346229e2aa78c98ac926871649c85e5dc484f9c Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 23 May 2019 11:45:01 +0200 Subject: [PATCH 110/115] parse conf to set params of auto tuner --- .../tencent/angel/ml/core/conf/MLConf.scala | 1 + .../tuner/config/ConfigurationSpace.scala | 22 +++- .../tuner/parameter/ContinuousSpace.scala | 5 +- .../tuner/parameter/DiscreteSpace.scala | 7 +- .../automl/tuner/parameter/ParamParser.scala | 114 ++++++++++++++++++ .../automl/tuner/parameter/ParamSpace.scala | 4 + .../spark/automl/tuner/solver/Solver.scala | 25 ++-- .../examples/cluster/AutoOfflineRunner.scala | 4 +- .../spark/ml/core/AutoOfflineLearner.scala | 40 +++--- .../tencent/angel/spark/ml/AutoFMTest.scala | 6 +- .../tencent/angel/spark/ml/AutoGPLRTest.scala | 5 +- .../angel/spark/ml/AutoGridLRTest.scala | 14 ++- .../angel/spark/ml/AutoRandomLRTest.scala | 14 ++- 13 files changed, 217 insertions(+), 44 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamParser.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index b88773f1b..6b6cb528f 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -205,6 +205,7 @@ object MLConf { val DEFAULT_ML_AUTO_TUNER_MODEL = "GaussianProcess" val ML_AUTO_TUNER_MINIMIZE = "ml.auto.tuner.minimize" val DEFAULT_ML_AUTO_TUNER_MINIMIZE = false + val ML_AUTO_TUNER_PARAMS = "ml.auto.tuner.params" /** The loss sum of all samples */ val TRAIN_LOSS = "train.loss" diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala index 37a4219c7..9706c4b49 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/ConfigurationSpace.scala @@ -20,13 +20,15 @@ package com.tencent.angel.spark.automl.tuner.config import com.tencent.angel.spark.automl.tuner.TunerParam import com.tencent.angel.spark.automl.tuner.math.BreezeOp._ -import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, ParamSpace} +import com.tencent.angel.spark.automl.tuner.parameter.{ContinuousSpace, DiscreteSpace, ParamSpace} import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.commons.logging.{Log, LogFactory} import org.apache.spark.ml.linalg.{Vector, Vectors} import org.apache.spark.sql.types._ +import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, HashSet} +import scala.reflect.ClassTag class ConfigurationSpace( val name: String, @@ -42,6 +44,9 @@ class ConfigurationSpace( var param2Doc: Map[String, String] = paramDict.map { case (k: String, v: ParamSpace[AnyVal]) => (k, v.doc) } var idx2Param: Map[Int, String] = param2Idx.map(_.swap) + // param name -> param type (continuous or discrete), value type (int, double,...) + val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() + // configurations tried var preX: HashSet[Vector] = HashSet[Vector]() var gridValues: Array[Configuration] = Array.empty @@ -53,9 +58,10 @@ class ConfigurationSpace( params.foreach(addParam) } - def addParam[T <: AnyVal](param: ParamSpace[T]): Unit = { + def addParam[T <: AnyVal: ClassTag](param: ParamSpace[T]): Unit = { if (!paramDict.contains(param.name)) { fields += DataTypes.createStructField(param.name, DataTypes.DoubleType, false) + paramType += param.name -> (param.pType, param.vType) paramDict += (param.name -> param) param2Idx += (param.name -> numParams) param2Doc += (param.name -> param.doc) @@ -65,6 +71,18 @@ class ConfigurationSpace( println(s"add param ${param.toString}, current params: ${paramDict.keySet.mkString(",")}") } + def addParamType(pName: String, pType: String, vType: String): Unit = { + if (!paramType.contains(pName)) + paramType += pName -> (pType, vType) + } + + def getParamType(pName: String): (String, String) = { + if (paramType.contains(pName)) + paramType(pName) + else + throw new AutoMLException(s"param $pName not exists in the configuration space.") + } + def getFields: Array[StructField] = fields.toArray def getParams(): Array[ParamSpace[AnyVal]] = paramDict.values.toArray diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala index 423c1a855..d83a29293 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ContinuousSpace.scala @@ -40,7 +40,10 @@ class ContinuousSpace( distribution: Distribution.Value = Distribution.LINEAR, override val doc: String = "continuous param space") extends ParamSpace[Double](name, doc) { - private val helper: String = "supported format of continuous parameter: [0,1] or [0,1,100]" + private val helper: String = "supported format of continuous parameter: [0,1] or [0:1:100]" + + override val pType: String = "continuous" + override val vType: String = "double" def this(name: String, lower: Double, upper: Double) = { this(name, lower, upper, -1) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala index 1e190bb2f..7db6a97cf 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/DiscreteSpace.scala @@ -23,6 +23,8 @@ import com.tencent.angel.spark.automl.utils.AutoMLException import scala.reflect.ClassTag import scala.util.Random +import scala.reflect._ + /** * Search space with discrete values * @@ -34,7 +36,10 @@ class DiscreteSpace[T <: AnyVal : ClassTag]( var values: Array[T], override val doc: String = "discrete param") extends ParamSpace[T](name, doc) { - private val helper: String = "supported format of discrete parameter: [0.1,0.2,0.3,0.4] or [0.1:1:0.1]" + private val helper: String = "supported format of discrete parameter: {0.1,0.2,0.3,0.4} or {0.1:1:0.1}" + + override val pType: String = "discrete" + override val vType = classTag[T].runtimeClass.getSimpleName.toLowerCase def this(name: String, config: String, doc: String) = { this(name, Array.empty[T], doc) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamParser.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamParser.scala new file mode 100644 index 000000000..a43230ad6 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamParser.scala @@ -0,0 +1,114 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.automl.tuner.parameter + +import com.tencent.angel.spark.automl.utils.AutoMLException + +import scala.beans.BeanProperty + +/** + * parse configuration of auto tuning from the command + * valid format: PARAM_NAME|PARAM_TYPE|VALUE_TYPE|PARAM_RANGE|OPTIONS, multiple params are separated by # + * example: ml.learn.rate|C|double|0.01,1|linear#ml.learn.decay|D|double|0,0.01,0.1 + */ +object ParamParser { + + val helper = "supported format: PARAM_NAME|PARAM_TYPE|VALUE_TYPE|PARAM_RANGE|OPTIONS, OPTIONS is optional" + val helper_param_type = "param type should be D, C or CA (D means discrete, C means continuous, and CA means categorical" + val helper_value_type = "value type should be float, double, int or long" + + val INTER_PARAM_SEP = "#" + val INNER_PARAM_SEP = "\\|" + + def parse(input: String): Array[ParamConfig] = { + separateParams(input).map(parseOneParam) + } + + /** + * separate the config command to a set of parameter config + */ + def separateParams(input: String): Array[String] = { + val params = input.split(INTER_PARAM_SEP) + assert(params.nonEmpty, helper) + params + } + + /** + * parse config for each parameter + */ + def parseOneParam(input: String): ParamConfig = { + val configs = input.split(INNER_PARAM_SEP) + println(s"configs: ${configs.mkString(",")}") + assert(configs.size == 4 || configs.size == 5, helper) + val paramName = getParamName(configs) + val paramType = getParamType(configs) + val valueType = getValueType(configs, paramType) + val paramRange = getParamRange(configs, paramType) + val options = getOptions(configs) + new ParamConfig(paramName, paramType, valueType, paramRange, options) + } + + def getParamName(configs: Array[String]): String = configs(0) + + def getParamType(configs: Array[String]): String = { + val paramType = configs(1).toUpperCase + paramType match { + case "D" => "discrete" + case "C" => "continuous" + case "CA" => "categorical" + case _ => throw new AutoMLException(helper_param_type) + } + } + + def getValueType(configs: Array[String], paramType: String): String = { + val valueType = configs(2).toLowerCase + paramType match { + case "discrete" => + assert(Array("float", "double", "int", "long").contains(valueType), helper_value_type) + valueType + case "continuous" => + "double" + case "categorical" => + valueType + } + } + + def getParamRange(configs: Array[String], paramType: String): String = { + paramType match { + case "discrete" => configs(3).mkString("{","","}") + case "continuous" => configs(3).mkString("[","","]") + // TODO: use categorical specific format + case "categorical" => configs(3) + } + } + + + def getOptions(configs: Array[String]): Option[String] = { + if (configs.size == 4) + None + else + Some(configs(4)) + } + +} + +class ParamConfig(@BeanProperty var paramName: String, + @BeanProperty var paramType: String, + @BeanProperty var valueType: String, + @BeanProperty var paramRange: String, + @BeanProperty var option: Option[String]) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala index 773d73125..8fa8dbfd6 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/parameter/ParamSpace.scala @@ -31,6 +31,10 @@ import scala.reflect.ClassTag abstract class ParamSpace[+T: ClassTag](val name: String, val doc: String = "param with search space") { + val pType: String + + val vType: String + def sample(size: Int): List[T] def sampleOne(): T diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala index a3095f73e..3fa99f98c 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/solver/Solver.scala @@ -28,6 +28,8 @@ import com.tencent.angel.spark.automl.utils.AutoMLException import org.apache.spark.ml.linalg.Vector import org.apache.commons.logging.{Log, LogFactory} +import scala.collection.mutable + class Solver( val cs: ConfigurationSpace, val surrogate: Surrogate, @@ -39,14 +41,15 @@ class Solver( val PARAM_TYPES: Array[String] = Array("discrete", "continuous") - ensureValid() + lazy val valid: Boolean = ensureValid() - def ensureValid(): Unit = { + def ensureValid(): Boolean = { // ensure grid surrogateMode match { case SurrogateMode.GRID => cs.setAllToGrid() case _ => } + true } def getHistory(): (Array[Vector], Array[Double]) = (surrogate.preX.toArray, surrogate.preY.toArray) @@ -57,25 +60,31 @@ class Solver( cs.addParam(param) } - def addParam(pType: String, vType: String, name: String, config: String, seed: Int): Unit = { + def addParam(pName: String, pType: String, vType: String, config: String, seed: Int): Unit = { pType.toLowerCase match { case "discrete" => vType.toLowerCase match { - case "float" => addParam(new DiscreteSpace[Float](name, config)) - case "double" => addParam(new DiscreteSpace[Double](name, config)) - case "int" => addParam(new DiscreteSpace[Int](name, config)) - case "long" => addParam(new DiscreteSpace[Long](name, config)) + case "float" => addParam(new DiscreteSpace[Float](pName, config)) + case "double" => addParam(new DiscreteSpace[Double](pName, config)) + case "int" => addParam(new DiscreteSpace[Int](pName, config)) + case "long" => addParam(new DiscreteSpace[Long](pName, config)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case "continuous" => vType.toLowerCase match { - case "double" => addParam(new ContinuousSpace(name, config)) + case "double" => addParam(new ContinuousSpace(pName, config)) case _ => throw new AutoMLException(s"unsupported value type $vType") } case _ => throw new AutoMLException(s"unsupported param type $pType, should be ${PARAM_TYPES.mkString(",")}") } } + def getParamTypes: mutable.Map[String, (String, String)] = cs.paramType + + def getParamType(pName: String): (String, String) = { + cs.getParamType(pName) + } + /** * Suggests configurations to evaluate. */ diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala index e99a0848f..2f51fdd84 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala @@ -52,6 +52,8 @@ object AutoOfflineRunner { if (modelPath.length > 0) conf.set(AngelConf.ANGEL_LOAD_MODEL_PATH, modelPath) + conf.set(MLConf.ML_AUTO_TUNER_PARAMS, "ml.learn.rate|C|double|0.1:1:100|") + val sc = new SparkContext(conf) // start PS @@ -61,7 +63,7 @@ object AutoOfflineRunner { val model = GraphModel(className) val learner = new AutoOfflineLearner - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") + //learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") actionType match { case MLConf.ANGEL_ML_TRAIN => learner.train(input, output, modelPath, dim, model) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 765abafa4..59675aadd 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -24,7 +24,7 @@ import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} -import com.tencent.angel.spark.automl.tuner.parameter.ParamSpace +import com.tencent.angel.spark.automl.tuner.parameter.{ParamConfig, ParamParser, ParamSpace} import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.utils.AutoMLException import com.tencent.angel.spark.ml.core.metric.{AUC, Precision} @@ -42,11 +42,6 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v // Shared configuration with Angel-PS val conf = SharedConf.get() - // set tuner params - tuneIter = conf.getInt(MLConf.ML_AUTO_TUNER_ITER, MLConf.DEFAULT_ML_AUTO_TUNER_ITER) - minimize = conf.getBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, MLConf.DEFAULT_ML_AUTO_TUNER_MINIMIZE) - surrogate = conf.get(MLConf.ML_AUTO_TUNER_MODEL, MLConf.DEFAULT_ML_AUTO_TUNER_MODEL) - // Some params var numEpoch: Int = conf.getInt(MLConf.ML_EPOCH_NUM) var fraction: Double = conf.getDouble(MLConf.ML_BATCH_SAMPLE_RATIO) @@ -54,20 +49,33 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v println(s"fraction=$fraction validateRatio=$validationRatio numEpoch=$numEpoch") - val cs: ConfigurationSpace = new ConfigurationSpace("cs") - val solver: Solver = Solver(cs, minimize, surrogate) + var solver: Solver = null - // param name -> param type (continuous or discrete), value type (int, double,...) - val paramType: mutable.Map[String, (String, String)] = new mutable.HashMap[String, (String, String)]() + def init(): this.type = { + // set tuner params + tuneIter = conf.getInt(MLConf.ML_AUTO_TUNER_ITER, MLConf.DEFAULT_ML_AUTO_TUNER_ITER) + minimize = conf.getBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, MLConf.DEFAULT_ML_AUTO_TUNER_MINIMIZE) + surrogate = conf.get(MLConf.ML_AUTO_TUNER_MODEL, MLConf.DEFAULT_ML_AUTO_TUNER_MODEL) - def addParam(param: ParamSpace[AnyVal]): this.type = { - solver.addParam(param) + // init solver + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + solver = Solver(cs, minimize, surrogate) + val config = conf.get(MLConf.ML_AUTO_TUNER_PARAMS) + parseConfig(config) + this + } + + def parseConfig(input: String): this.type = { + val paramConfigs: Array[ParamConfig] = ParamParser.parse(input) + paramConfigs.foreach{ config => + addParam(config.getParamName, config.getParamType, config.getValueType, + config.getParamRange, Random.nextInt()) + } this } - def addParam(pType: String, vType: String, name: String, config: String, seed: Int = 100): this.type = { - paramType += name -> (pType.toLowerCase, vType.toLowerCase) - solver.addParam(pType, vType, name, config, seed) + def addParam(pName: String, pType: String, vType: String, config: String, seed: Int = 100): this.type = { + solver.addParam(pName, pType, vType, config, seed) this } @@ -206,7 +214,7 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v val configs: Array[Configuration] = solver.suggest for (config <- configs) { val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() - for (paramType <- paramType) { + for (paramType <- solver.getParamTypes) { setParam(paramType._1, paramType._2._2, config.get(paramType._1)) paramMap += (paramType._1 -> config.get(paramType._1)) } diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala index 3772d4c77..6bd0b7592 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoFMTest.scala @@ -41,7 +41,7 @@ class AutoFMTest extends PSFunSuite with SharedPSContext { SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") - SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 20) + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 10) SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) SharedConf.get().setDouble(MLConf.ML_BATCH_SAMPLE_RATIO, 0.2) @@ -52,9 +52,9 @@ class AutoFMTest extends PSFunSuite with SharedPSContext { SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") + SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, "ml.learn.rate|C|float|0.1:1:100") - learner = new AutoOfflineLearner - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") + learner = new AutoOfflineLearner().init() } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala index 75912b6d4..0bc5cedd2 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala @@ -36,9 +36,10 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") + SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, + "ml.learn.rate|C|double|0.1:1:100#ml.learn.decay|D|float|0,0.01,0.1") - learner = new AutoOfflineLearner - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") + learner = new AutoOfflineLearner().init() } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala index 9bc64b5df..d4a90c5fd 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGridLRTest.scala @@ -15,7 +15,7 @@ class AutoGridLRTest extends PSFunSuite with SharedPSContext { override def beforeAll(): Unit = { super.beforeAll() - input = "../data/census/census_148d_train.libsvm" + input = "../../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -24,7 +24,7 @@ class AutoGridLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") - SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 10) SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) @@ -33,9 +33,13 @@ class AutoGridLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(minimize = false,surrogate = "Grid") - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:5]",seed = 10) - learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "[0.1:1:5]",seed = 20) + SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) + SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) + SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "Grid") + SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, + "ml.learn.rate|C|double|0.1:1:5#ml.learn.decay|D|double|0,0.01,0.1") + + learner = new AutoOfflineLearner().init() } override def afterAll(): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala index 22165ebdd..63257aa83 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoRandomLRTest.scala @@ -15,7 +15,7 @@ class AutoRandomLRTest extends PSFunSuite with SharedPSContext { override def beforeAll(): Unit = { super.beforeAll() - input = "../data/census/census_148d_train.libsvm" + input = "../../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -24,7 +24,7 @@ class AutoRandomLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.5) SharedConf.get().setDouble(MLConf.ML_LEARN_DECAY, 0.2) SharedConf.get().set(MLConf.ML_DATA_INPUT_FORMAT, "libsvm") - SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 50) + SharedConf.get().setInt(MLConf.ML_EPOCH_NUM, 10) SharedConf.get().setInt(MLConf.ML_DECAY_INTERVALS, 10) SharedConf.get().setDouble(MLConf.ML_VALIDATE_RATIO, 0.1) SharedConf.get().setDouble(MLConf.ML_REG_L2, 0.0) @@ -33,9 +33,13 @@ class AutoRandomLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) - learner = new AutoOfflineLearner(2,false,"Random") - learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]",seed = 10) - learner.addParam("continuous", "double", MLConf.ML_LEARN_DECAY, "[0.1:1:100]",seed = 20) + SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 10) + SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) + SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "Random") + SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, + "ml.learn.rate|C|double|0.1:1:5#ml.learn.decay|D|double|0,0.01,0.1") + + learner = new AutoOfflineLearner().init() } override def afterAll(): Unit = { From 437a6d7b470c441cb4763f8c2fd515a0cd3217d7 Mon Sep 17 00:00:00 2001 From: wtaozhang <1299799152@qq.com> Date: Mon, 27 May 2019 23:41:56 +0800 Subject: [PATCH 111/115] Solve conflicts --- .../spark/automl/tuner/acquisition/UCB.scala | 60 ++++++++++++++ .../automl/tuner/config/EarlyStopping.scala | 79 +++++++++++++++++++ .../spark/ml/core/AutoOfflineLearner.scala | 22 +++++- .../tencent/angel/spark/ml/AutoGPLRTest.scala | 7 +- 4 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/UCB.scala create mode 100644 spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/UCB.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/UCB.scala new file mode 100644 index 000000000..d7a91cb30 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/acquisition/UCB.scala @@ -0,0 +1,60 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.tuner.acquisition + +import com.tencent.angel.spark.automl.tuner.surrogate.Surrogate +import org.apache.commons.logging.{Log, LogFactory} +import org.apache.spark.ml.linalg.{Vector, Vectors} + +/** + * Expected improvement. + * + * @param surrogate + * @param beta : Controls the upper confidence bound + * Assume : + * - t: number of iteration + * - d: dimension of optimization space + * - v: hyperparameter v = 1 + * - delta: small constant 0.1 (prob of regret) + * Suggest value:beta = sqrt( v* (2* log( (t**(d/2. + 2))*(pi**2)/(3. * delta) ))) + */ +class UCB( + override val surrogate: Surrogate, + val beta: Double = 100) + extends Acquisition(surrogate) { + + val LOG: Log = LogFactory.getLog(classOf[Surrogate]) + + override def compute(X: Vector, derivative: Boolean = false): (Double, Vector) = { + val pred = surrogate.predict(X) // (mean, variance) + + val m: Double = pred._1 + val s: Double = Math.sqrt(pred._2) + + if (s == 0) { + // if std is zero, we have observed x on all instances + // using a RF, std should be never exactly 0.0 + (0.0, Vectors.dense(new Array[Double](X.size))) + } else { + val ucb = m + beta*s + + (ucb, Vectors.dense(new Array[Double](X.size))) + } + } +} \ No newline at end of file diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala new file mode 100644 index 000000000..b5cd73d28 --- /dev/null +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala @@ -0,0 +1,79 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + + +package com.tencent.angel.spark.automl.tuner.config + +/** + * A single configuration + * + * @param patience : How long to wait after last time validation loss improved. + * Default: 5 + * @param minimize : Whether to minimize or maximize the val_score + * Default: false + */ +class EarlyStopping(patience:Int=5, + var minDelta:Double = 0.0, + minimize:Boolean=false) { + + var counter: Int = 0 + var bestScore: Double = Double.NegativeInfinity + var earlyStop: Boolean = false + val pat = patience + + def greater(a: Double, b: Double): Boolean = { + if (a > b) { + return true + } + else { + return false + } + } + + var monitorOp = greater _ + + def less(a: Double, b: Double): Boolean = { + if (a > b) { + return false + } + else { + return true + } + } + + if (minimize) { + monitorOp = less _ + minDelta = -minDelta + bestScore = Double.PositiveInfinity + } + + + def update(val_score: Double): Unit = { + val score = val_score + if (monitorOp(score - minDelta, bestScore)) { + bestScore = score + counter = 0 + } + else { + counter += 1 + println(s"EarlyStopping counter: ${counter} out of ${patience}") + if (counter >= patience) { + earlyStop = true + } + } + } +} \ No newline at end of file diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 59675aadd..702411dd1 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -23,7 +23,7 @@ import com.tencent.angel.ml.core.optimizer.loss.{L2Loss, LogLoss} import com.tencent.angel.ml.feature.LabeledData import com.tencent.angel.ml.math2.matrix.{BlasDoubleMatrix, BlasFloatMatrix} import com.tencent.angel.spark.context.PSContext -import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace} +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace,EarlyStopping} import com.tencent.angel.spark.automl.tuner.parameter.{ParamConfig, ParamParser, ParamSpace} import com.tencent.angel.spark.automl.tuner.solver.Solver import com.tencent.angel.spark.automl.utils.AutoMLException @@ -37,7 +37,8 @@ import scala.collection.mutable import scala.reflect.ClassTag import scala.util.Random -class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, var surrogate: String = "GaussianProcess") { +class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, var surrogate: String = "GaussianProcess", + var earlyStopping: EarlyStopping = new EarlyStopping(patience = 0)) { // Shared configuration with Angel-PS val conf = SharedConf.get() @@ -221,7 +222,22 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v resetParam(paramMap) model.resetParam(paramMap).graph.init(0) val result = train(data, model) - solver.feed(config, result._1) + if(earlyStopping.pat > 0){ + earlyStopping.update(result._1) + if (earlyStopping.earlyStop) { + println("Early stopping") + val result: (Vector, Double) = solver.optimal + solver.stop + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + return + } + else { + solver.feed(config, result._1) + } + } + else { + solver.feed(config, result._1) + } } } val result: (Vector, Double) = solver.optimal diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala index 0bc5cedd2..33790fa6b 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala @@ -4,6 +4,7 @@ import com.tencent.angel.RunningMode import com.tencent.angel.conf.AngelConf import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} import com.tencent.angel.ml.matrix.RowType +import com.tencent.angel.spark.automl.tuner.config.EarlyStopping import com.tencent.angel.spark.ml.classification.LogisticRegression import com.tencent.angel.spark.ml.core.AutoOfflineLearner @@ -15,7 +16,7 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { override def beforeAll(): Unit = { super.beforeAll() - input = "../data/census/census_148d_train.libsvm" + input = "../../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -38,8 +39,8 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, "ml.learn.rate|C|double|0.1:1:100#ml.learn.decay|D|float|0,0.01,0.1") - - learner = new AutoOfflineLearner().init() + val Earlystop = new EarlyStopping(patience = 5, minimize = false, minDelta = 0.01) + learner = new AutoOfflineLearner(earlyStopping = Earlystop).init() } override def afterAll(): Unit = { From bbb6f9454c1f2024bf85eb926897383b862bdbde Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 30 May 2019 10:29:16 +0200 Subject: [PATCH 112/115] refactor earsly stopping --- .../automl/tuner/config/EarlyStopping.scala | 43 +++++-------------- .../examples/cluster/AutoOfflineRunner.scala | 2 +- .../spark/ml/core/AutoOfflineLearner.scala | 33 +++++++------- .../tencent/angel/spark/ml/AutoGPLRTest.scala | 6 +-- 4 files changed, 31 insertions(+), 53 deletions(-) diff --git a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala index b5cd73d28..2a29b5b1c 100644 --- a/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala +++ b/spark-on-angel/automl/src/main/scala/com/tencent/angel/spark/automl/tuner/config/EarlyStopping.scala @@ -26,51 +26,30 @@ package com.tencent.angel.spark.automl.tuner.config * @param minimize : Whether to minimize or maximize the val_score * Default: false */ -class EarlyStopping(patience:Int=5, - var minDelta:Double = 0.0, - minimize:Boolean=false) { +class EarlyStopping(patience: Int = 5, + minDelta: Double = 0.0, + minimize: Boolean = false) { var counter: Int = 0 - var bestScore: Double = Double.NegativeInfinity + var bestScore: Double = if (minimize) Double.PositiveInfinity else Double.NegativeInfinity var earlyStop: Boolean = false val pat = patience - def greater(a: Double, b: Double): Boolean = { - if (a > b) { - return true - } - else { - return false - } - } - - var monitorOp = greater _ - - def less(a: Double, b: Double): Boolean = { - if (a > b) { - return false - } - else { - return true - } - } + def greater(a: Double, b: Double): Boolean = a > b + def less(a: Double, b: Double): Boolean = a < b - if (minimize) { - monitorOp = less _ - minDelta = -minDelta - bestScore = Double.PositiveInfinity - } + val monitorOp: (Double, Double) => Boolean = if (minimize) less else greater + def bound(score: Double): Double = if (minimize) score + minDelta else score - minDelta def update(val_score: Double): Unit = { val score = val_score - if (monitorOp(score - minDelta, bestScore)) { + if (monitorOp(bound(score), bestScore)) { bestScore = score counter = 0 - } - else { + } else { counter += 1 - println(s"EarlyStopping counter: ${counter} out of ${patience}") + println(s"EarlyStopping counter: $counter out of $patience") if (counter >= patience) { earlyStop = true } diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala index 2f51fdd84..deead1dcc 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoOfflineRunner.scala @@ -62,7 +62,7 @@ object AutoOfflineRunner { val className = "com.tencent.angel.spark.ml.classification." + network val model = GraphModel(className) - val learner = new AutoOfflineLearner + val learner = new AutoOfflineLearner().init() //learner.addParam("continuous", "double", MLConf.ML_LEARN_RATE, "[0.1:1:100]") actionType match { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 702411dd1..6206f6541 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -38,7 +38,7 @@ import scala.reflect.ClassTag import scala.util.Random class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, var surrogate: String = "GaussianProcess", - var earlyStopping: EarlyStopping = new EarlyStopping(patience = 0)) { + var earlyStopping: EarlyStopping = null) { // Shared configuration with Angel-PS val conf = SharedConf.get() @@ -222,22 +222,21 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v resetParam(paramMap) model.resetParam(paramMap).graph.init(0) val result = train(data, model) - if(earlyStopping.pat > 0){ - earlyStopping.update(result._1) - if (earlyStopping.earlyStop) { - println("Early stopping") - val result: (Vector, Double) = solver.optimal - solver.stop - println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - return - } - else { - solver.feed(config, result._1) - } - } - else { - solver.feed(config, result._1) - } + solver.feed(config, result._1) +// if (earlyStopping.pat > 0){ +// earlyStopping.update(result._1) +// if (earlyStopping.earlyStop) { +// println("Early stopping") +// val result: (Vector, Double) = solver.optimal +// solver.stop +// println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") +// return +// } else { +// solver.feed(config, result._1) +// } +// } else { +// solver.feed(config, result._1) +// } } } val result: (Vector, Double) = solver.optimal diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala index 33790fa6b..400b33eb6 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGPLRTest.scala @@ -16,7 +16,7 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { override def beforeAll(): Unit = { super.beforeAll() - input = "../../data/census/census_148d_train.libsvm" + input = "../data/census/census_148d_train.libsvm" // build SharedConf with params SharedConf.get() @@ -39,8 +39,8 @@ class AutoGPLRTest extends PSFunSuite with SharedPSContext { SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, "ml.learn.rate|C|double|0.1:1:100#ml.learn.decay|D|float|0,0.01,0.1") - val Earlystop = new EarlyStopping(patience = 5, minimize = false, minDelta = 0.01) - learner = new AutoOfflineLearner(earlyStopping = Earlystop).init() + //val Earlystop = new EarlyStopping(patience = 5, minimize = false, minDelta = 0.01) + learner = new AutoOfflineLearner().init() } override def afterAll(): Unit = { From 4b521b3ef7f2a5d891171904a14477f62dee771c Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Fri, 31 May 2019 06:18:25 +0200 Subject: [PATCH 113/115] dependency error --- spark-on-angel/examples/pom.xml | 1 - .../angel/spark/examples/automl/GPTunerExample.scala | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/spark-on-angel/examples/pom.xml b/spark-on-angel/examples/pom.xml index ce3aec210..65d395f8f 100644 --- a/spark-on-angel/examples/pom.xml +++ b/spark-on-angel/examples/pom.xml @@ -51,7 +51,6 @@ com.tencent.angel spark-on-angel-automl ${project.version} - ${dist.deps.scope} com.tencent.angel diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala index c94174b1f..036ae9157 100644 --- a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/automl/GPTunerExample.scala @@ -28,11 +28,11 @@ object GPTunerExample extends App { override def main(args: Array[String]): Unit = { - val param1: ParamSpace[Double] = new ContinuousSpace("param1", "1,10") - val param2: ParamSpace[Double] = new ContinuousSpace("param2", "-5,5,10") - val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "0.0,1.0,3.0,5.0") - val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "-5:5:1") - val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate ="GP") + val param1: ParamSpace[Double] = new ContinuousSpace("param1", "[1,10]") + val param2: ParamSpace[Double] = new ContinuousSpace("param2", "[-5:5:10]") + val param3: ParamSpace[Double] = new DiscreteSpace[Double]("param3", "{0.0,1.0,3.0,5.0}") + val param4: ParamSpace[Int] = new DiscreteSpace[Int]("param4", "{-5:5:1}") + val solver: Solver = Solver(Array(param1, param2, param3, param4), true, surrogate ="GaussianProcess") val trail: Trail = new TestTrail() (0 until 100).foreach{ iter => println(s"------iteration $iter starts------") From 8a37afd60e0b44386331f9c9b606a20c3e5d3666 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Sun, 9 Jun 2019 11:57:21 +0800 Subject: [PATCH 114/115] trainer returns metrics --- .../tree/gbdt/examples/GBDTRegression.scala | 2 +- .../tree/gbdt/examples/GBDTTrainExample.scala | 2 +- .../ml/tree/gbdt/trainer/GBDTTrainer.scala | 30 ++++++++++++------- .../com/tencent/angel/spark/ml/GBDTTest.scala | 4 +-- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTRegression.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTRegression.scala index 289575649..fb832a3f9 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTRegression.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTRegression.scala @@ -90,7 +90,7 @@ object GBDTRegression { try { val trainer = new GBDTTrainer(param) trainer.initialize(trainPath, validPath) - val model = trainer.train() + val (model, metrics) = trainer.train() trainer.save(model, modelPath) } catch { case e: Exception => diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTTrainExample.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTTrainExample.scala index 0fb4b4a9d..3cec5ae6b 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTTrainExample.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTTrainExample.scala @@ -90,7 +90,7 @@ object GBDTTrainExample { try { val trainer = new GBDTTrainer(param) trainer.initialize(trainPath, validPath) - val model = trainer.train() + val (model, metrics) = trainer.train() trainer.save(model, modelPath) } catch { case e: Exception => diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala index 445711935..a4d5ceceb 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala @@ -37,7 +37,7 @@ import org.apache.spark.broadcast.Broadcast import org.apache.spark.rdd.RDD import org.apache.spark.{Partitioner, SparkConf, SparkContext, TaskContext} -import scala.collection.mutable.{ArrayBuilder => AB} +import scala.collection.mutable.{ArrayBuffer, ArrayBuilder => AB} object GBDTTrainer { @@ -127,7 +127,8 @@ object GBDTTrainer { try { val trainer = new GBDTTrainer(param) trainer.initialize(trainPath, validPath) - val model = trainer.train() + val (model, metrics) = trainer.train() + metrics.foreach(println) trainer.save(model, modelPath) } catch { case e: Exception => @@ -424,13 +425,15 @@ class GBDTTrainer(param: GBDTParam) extends Serializable { println(s"Initialization done, cost ${System.currentTimeMillis() - initStart} ms in total") } - def train(): Seq[GBTTree] = { + def train(): (Seq[GBTTree], Array[Double]) = { val trainStart = System.currentTimeMillis() val loss = ObjectiveFactory.getLoss(param.lossFunc) val evalMetrics = ObjectiveFactory.getEvalMetricsOrDefault(param.evalMetrics, loss) //val multiStrategy = ObjectiveFactory.getMultiStrategy(param.multiStrategy) + val metrics: ArrayBuffer[Double] = new ArrayBuffer[Double]() + LogHelper.setLogLevel("info") for (treeId <- 0 until param.numTree) { @@ -510,17 +513,24 @@ class GBDTTrainer(param: GBDTParam) extends Serializable { }) if (! (param.isMultiClassMultiTree && (treeId + 1) % param.numClass != 0) ) { val evalTrainMsg = (evalMetrics, trainMetrics).zipped.map { - case (evalMetric, trainSum) => evalMetric.getKind match { - case Kind.AUC => s"${evalMetric.getKind}[${evalMetric.avg(trainSum, workers.count.toInt)}]" - case _ => s"${evalMetric.getKind}[${evalMetric.avg(trainSum, numTrain)}]" + case (evalMetric, trainSum) => { + val metric: Double = evalMetric.getKind match { + case Kind.AUC => evalMetric.avg(trainSum, workers.count.toInt) + case _ => evalMetric.avg(trainSum, numTrain) + } + s"${evalMetric.getKind}[$metric]" } }.mkString(", ") val round = if (param.isMultiClassMultiTree) (treeId + 1) / param.numClass else (treeId + 1) println(s"Evaluation on train data after ${round} tree(s): $evalTrainMsg") val evalValidMsg = (evalMetrics, validMetrics).zipped.map { - case (evalMetric, validSum) => evalMetric.getKind match { - case Kind.AUC => s"${evalMetric.getKind}[${evalMetric.avg(validSum, workers.count.toInt)}]" - case _ => s"${evalMetric.getKind}[${evalMetric.avg(validSum, numValid)}]" + case (evalMetric, validSum) => { + val metric: Double = evalMetric.getKind match { + case Kind.AUC => evalMetric.avg(validSum, workers.count.toInt) + case _ => evalMetric.avg(validSum, numValid) + } + if (treeId == param.numTree - 1) metrics += metric + s"${evalMetric.getKind}[$metric]" } }.mkString(", ") println(s"Evaluation on valid data after ${round} tree(s): $evalValidMsg") @@ -543,7 +553,7 @@ class GBDTTrainer(param: GBDTParam) extends Serializable { println(s"Tree[${treeId + 1}] contains ${tree.size} nodes " + s"(${(tree.size - 1) / 2 + 1} leaves)") } - forest + (forest, metrics.toArray) } def save(model: Seq[GBTTree], modelPath: String)(implicit sc: SparkContext): Unit = { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala index 876a29150..04dcb8631 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala @@ -60,8 +60,8 @@ class GBDTTest extends PSFunSuite with SharedPSContext { test("GBDT") { try { trainer.initialize(trainPath, testPath)(sc) - val model = trainer.train() - + val (model, metrics) = trainer.train() + metrics.foreach(println) println(s"Model will be saved to $modelPath") trainer.save(model, modelPath)(sc) From d984d227d8edff476a408d564099c5a59deba299 Mon Sep 17 00:00:00 2001 From: bluesjjw Date: Thu, 13 Jun 2019 17:20:07 +0800 Subject: [PATCH 115/115] tune the hyper-parameters of GBDT --- .../tencent/angel/ml/core/conf/MLConf.scala | 2 +- .../examples/cluster/AutoGBDTRunner.scala | 48 +++++ .../spark/ml/core/AutoOfflineLearner.scala | 8 +- .../gbdt/examples/GBDTPredictExample.java | 2 +- .../ml/tree/gbdt/helper/SplitFinder.scala | 1 + .../tree/gbdt/predictor/GBDTPredictor.scala | 8 +- .../tree/gbdt/trainer/AutoGBDTLearner.scala | 202 ++++++++++++++++++ .../gbdt/trainer/FPGBDTTrainerWrapper.scala | 6 + .../ml/tree/gbdt/trainer/GBDTTrainer.scala | 9 + .../angel/spark/ml/tree/split/SplitSet.java | 2 + .../tencent/angel/spark/ml/AutoGBDTTest.scala | 74 +++++++ .../com/tencent/angel/spark/ml/GBDTTest.scala | 4 +- 12 files changed, 352 insertions(+), 14 deletions(-) create mode 100644 spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoGBDTRunner.scala create mode 100644 spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/AutoGBDTLearner.scala create mode 100644 spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGBDTTest.scala diff --git a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala index 480ba2378..5153f362c 100644 --- a/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala +++ b/angel-ps/mllib/src/main/scala/com/tencent/angel/ml/core/conf/MLConf.scala @@ -216,7 +216,7 @@ object MLConf { val ML_GBDT_MIN_CHILD_WEIGHT = "ml.gbdt.min.child.weight" val DEFAULT_ML_GBDT_MIN_CHILD_WEIGHT = 0.01 val ML_GBDT_REG_ALPHA = "ml.gbdt.reg.alpha" - val DEFAULT_ML_GBDT_REG_ALPHA = 0 + val DEFAULT_ML_GBDT_REG_ALPHA = 0.0 val ML_GBDT_REG_LAMBDA = "ml.gbdt.reg.lambda" val DEFAULT_ML_GBDT_REG_LAMBDA = 1.0 val ML_GBDT_THREAD_NUM = "ml.gbdt.thread.num" diff --git a/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoGBDTRunner.scala b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoGBDTRunner.scala new file mode 100644 index 000000000..c1d4c7d78 --- /dev/null +++ b/spark-on-angel/examples/src/main/scala/com/tencent/angel/spark/examples/cluster/AutoGBDTRunner.scala @@ -0,0 +1,48 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.examples.cluster + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.SharedConf +import com.tencent.angel.spark.ml.core.ArgsUtil +import com.tencent.angel.spark.ml.tree.gbdt.trainer.AutoGBDTLearner +import org.apache.spark.{SparkConf, SparkContext} + +object AutoGBDTRunner { + + def main(args: Array[String]): Unit = { + + val params = ArgsUtil.parse(args) + + // set running mode, use angel_ps mode for spark + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + // build SharedConf with params + SharedConf.addMap(params) + + val conf = new SparkConf() + + implicit val sc: SparkContext = new SparkContext(conf) + + val learner = new AutoGBDTLearner().init() + learner.train() + + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala index 6206f6541..b2f7f0a2c 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/core/AutoOfflineLearner.scala @@ -239,16 +239,12 @@ class AutoOfflineLearner(var tuneIter: Int = 20, var minimize: Boolean = true, v // } } } - val result: (Vector, Double) = solver.optimal - solver.stop + val result: (Vector, Double) = solver.optimal() + solver.stop() println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") - //if (modelOutput.length > 0) model.save(modelOutput) - } - - def predict(input: String, output: String, modelInput: String, diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTPredictExample.java b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTPredictExample.java index 743183dc3..efc2c9456 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTPredictExample.java +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/examples/GBDTPredictExample.java @@ -32,7 +32,7 @@ public static void main(String[] argv) { SparkContext sc = new SparkContext(conf); String modelPath = "xxx"; GBDTPredictor predictor = new GBDTPredictor(); - predictor.loadModel(sc, modelPath); + predictor.loadModel(modelPath, sc); int dim = 181; // predict sparse instance with indices and values int[] indices = {6, 7, 11, 18, 20, 24, 27, 30, 33, 34, 38, 42, 45, 47, 53, 60, 61, 65, 69, 70, 75, 78, 79, 84, 87, 88, 92, 99, 101, 103, 108, 110, 112, 119, 123, 124, 128, 131, 134, 137, 139, 142, 147, 149, 156, 157, 161, 164, 166, 171, 173, 180}; diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/helper/SplitFinder.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/helper/SplitFinder.scala index 10b3414f4..c64b185b2 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/helper/SplitFinder.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/helper/SplitFinder.scala @@ -99,6 +99,7 @@ object SplitFinder { var curSplitId = 0 val edges = ArrayBuffer[Float]() edges.sizeHint(FeatureInfo.ENUM_THRESHOLD) + edges += splits(0) val binGradPair = if (param.numClass == 2 || param.isMultiClassMultiTree) { new BinaryGradPair() } else { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/predictor/GBDTPredictor.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/predictor/GBDTPredictor.scala index 676b4a48a..1da00e9f8 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/predictor/GBDTPredictor.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/predictor/GBDTPredictor.scala @@ -32,7 +32,7 @@ class GBDTPredictor extends Serializable { var forest: Seq[GBTTree] = _ - def loadModel(sc: SparkContext, modelPath: String): Unit = { + def loadModel(modelPath: String)(implicit sc: SparkContext): Unit = { forest = sc.objectFile[Seq[GBTTree]](modelPath).collect().head println(s"Reading model from $modelPath") } @@ -46,7 +46,7 @@ class GBDTPredictor extends Serializable { } } - def predict(implicit sc: SparkContext, predictPath: String, outputPath: String): Unit = { + def predict(predictPath: String, outputPath: String)(implicit sc: SparkContext): Unit = { println(s"Predicting dataset: $predictPath") val instances: RDD[Instance] = DataLoader.loadLibsvmDP(predictPath, forest.head.getParam.numFeature).cache() //val labels = instances.map(_.label.toFloat).collect() @@ -171,8 +171,8 @@ object GBDTPredictor { val outputPath = params.getOrElse(AngelConf.ANGEL_PREDICT_PATH, "xxx") val predictor = new GBDTPredictor - predictor.loadModel(sc, modelPath) - predictor.predict(sc, predictPath, outputPath) + predictor.loadModel(modelPath) + predictor.predict(predictPath, outputPath) sc.stop } diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/AutoGBDTLearner.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/AutoGBDTLearner.scala new file mode 100644 index 000000000..991b1e26e --- /dev/null +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/AutoGBDTLearner.scala @@ -0,0 +1,202 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.ml.tree.gbdt.trainer + +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.spark.automl.tuner.config.{Configuration, ConfigurationSpace, EarlyStopping} +import com.tencent.angel.spark.automl.tuner.parameter.{ParamConfig, ParamParser} +import com.tencent.angel.spark.automl.tuner.solver.Solver +import com.tencent.angel.spark.automl.utils.AutoMLException +import com.tencent.angel.spark.ml.core.ArgsUtil +import com.tencent.angel.spark.ml.tree.param.GBDTParam +import com.tencent.angel.spark.ml.tree.util.Maths +import com.tencent.angel.spark.ml.util.SparkUtils +import org.apache.spark.ml.linalg.Vector +import org.apache.spark.{SparkConf, SparkContext} + +import scala.collection.mutable +import scala.util.Random + +class AutoGBDTLearner(var tuneIter: Int = 20, + var minimize: Boolean = true, + var surrogate: String = "GaussianProcess", + var earlyStopping: EarlyStopping = null) { + + // Shared configuration with Angel-PS + val conf = SharedConf.get() + + var solver: Solver = null + + def init(): this.type = { + // set tuner params + tuneIter = conf.getInt(MLConf.ML_AUTO_TUNER_ITER, MLConf.DEFAULT_ML_AUTO_TUNER_ITER) + minimize = conf.getBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, MLConf.DEFAULT_ML_AUTO_TUNER_MINIMIZE) + surrogate = conf.get(MLConf.ML_AUTO_TUNER_MODEL, MLConf.DEFAULT_ML_AUTO_TUNER_MODEL) + + // init solver + val cs: ConfigurationSpace = new ConfigurationSpace("cs") + solver = Solver(cs, minimize, surrogate) + val config = conf.get(MLConf.ML_AUTO_TUNER_PARAMS) + parseConfig(config) + this + } + + def train()(implicit sc: SparkContext): Unit = { + + val sparkConf = sc.getConf + + var param = new GBDTParam + + // spark conf + val numExecutor = SparkUtils.getNumExecutors(sparkConf) + val numCores = sparkConf.getInt("spark.executor.cores", 1) + sparkConf.set("spark.task.cpus", numCores.toString) + sparkConf.set("spark.locality.wait", "0") + sparkConf.set("spark.memory.fraction", "0.7") + sparkConf.set("spark.memory.storageFraction", "0.8") + sparkConf.set("spark.task.maxFailures", "1") + sparkConf.set("spark.yarn.maxAppAttempts", "1") + sparkConf.set("spark.network.timeout", "1000") + sparkConf.set("spark.executor.heartbeatInterval", "500") + + /** not tunerable params**/ + param.numWorker = numExecutor + param.numThread = numCores + // dataset conf + param.taskType = SharedConf.get().get(MLConf.ML_GBDT_TASK_TYPE, MLConf.DEFAULT_ML_GBDT_TASK_TYPE) + param.numClass = SharedConf.get().getInt(MLConf.ML_NUM_CLASS, MLConf.DEFAULT_ML_NUM_CLASS) + param.numFeature = SharedConf.get().getInt(MLConf.ML_FEATURE_INDEX_RANGE, -1) + // loss and metric + param.lossFunc = SharedConf.get().get(MLConf.ML_GBDT_LOSS_FUNCTION, "binary:logistic") + param.evalMetrics = SharedConf.get().get(MLConf.ML_GBDT_EVAL_METRIC, "error").split(",").map(_.trim).filter(_.nonEmpty) + require(param.evalMetrics.size == 1, "only one eval metric is allowed under the tuning mode.") + // task type + param.taskType match { + case "regression" => + require(param.lossFunc.equals("rmse") && param.evalMetrics(0).equals("rmse"), + "loss function and metric of regression task should be rmse") + param.numClass = 2 + case "classification" => + require(param.numClass >= 2, "number of labels should be larger than 2") + param.multiStrategy = SharedConf.get().get("ml.gbdt.multi.class.strategy", "one-tree") + if (param.isMultiClassMultiTree) param.lossFunc = "binary:logistic" + param.multiGradCache = SharedConf.get().getBoolean("ml.gbdt.multi.class.grad.cache", true) + } + // conf switch + param.histSubtraction = SharedConf.get().getBoolean(MLConf.ML_GBDT_HIST_SUBTRACTION, true) + param.lighterChildFirst = SharedConf.get().getBoolean(MLConf.ML_GBDT_LIGHTER_CHILD_FIRST, true) + param.fullHessian = SharedConf.get().getBoolean(MLConf.ML_GBDT_FULL_HESSIAN, false) + + println(s"Hyper-parameters:\n$param") + + val trainPath = SharedConf.get().get(AngelConf.ANGEL_TRAIN_DATA_PATH, "xxx") + val validPath = SharedConf.get().get(AngelConf.ANGEL_VALIDATE_DATA_PATH, "xxx") + val modelPath = SharedConf.get().get(AngelConf.ANGEL_SAVE_MODEL_PATH, "xxx") + + (0 until tuneIter).foreach{ iter => + println(s"==========Tuner Iteration[$iter]==========") + val configs: Array[Configuration] = solver.suggest() + for (config <- configs) { + val paramMap: mutable.Map[String, Double] = new mutable.HashMap[String, Double]() + for (paramType <- solver.getParamTypes) { + setParam(paramType._1, paramType._2._2, config.get(paramType._1)) + paramMap += (paramType._1 -> config.get(paramType._1)) + } + param = updateGBDTParam(param, paramMap) + + val trainer = new GBDTTrainer(param) + trainer.initialize(trainPath, validPath) + val (model, metrics) = trainer.train() + trainer.save(model, modelPath) + trainer.clear() + + solver.feed(config, metrics(0)) + } + } + + val result: (Vector, Double) = solver.optimal() + solver.stop() + println(s"Best configuration ${result._1.toArray.mkString(",")}, best performance: ${result._2}") + + } + + def parseConfig(input: String): Unit = { + val paramConfigs: Array[ParamConfig] = ParamParser.parse(input) + paramConfigs.foreach{ config => + solver.addParam(config.getParamName, config.getParamType, config.getValueType, + config.getParamRange, Random.nextInt()) + } + } + + def setParam(name: String, vType: String, value: Double): Unit = { + println(s"set param[$name] type[$vType] value[$value]") + vType match { + case "int" => SharedConf.get().setInt(name, value.toInt) + case "long" => SharedConf.get().setLong(name, value.toLong) + case "float" => SharedConf.get().setFloat(name, value.toFloat) + case "double" => SharedConf.get().setDouble(name, value) + case _ => throw new AutoMLException(s"unsupported value type $vType") + } + } + + def updateGBDTParam(param: GBDTParam, paramMap: mutable.Map[String, Double]): GBDTParam = { + paramMap.foreach(println) + + case class ParseOp[T](op: String => T) + implicit val toFloat = ParseOp[Double](_.toFloat) + + // major algo conf + param.featSampleRatio = paramMap.getOrElse(MLConf.ML_GBDT_FEATURE_SAMPLE_RATIO, + MLConf.DEFAULT_ML_GBDT_FEATURE_SAMPLE_RATIO).toFloat + SharedConf.get().setFloat(MLConf.ML_GBDT_FEATURE_SAMPLE_RATIO, param.featSampleRatio) + param.learningRate = paramMap.getOrElse(MLConf.ML_LEARN_RATE, + MLConf.DEFAULT_ML_LEARN_RATE).toFloat + SharedConf.get().setFloat(MLConf.ML_LEARN_RATE, param.learningRate) + param.numSplit = paramMap.getOrElse(MLConf.ML_GBDT_SPLIT_NUM, + MLConf.DEFAULT_ML_GBDT_SPLIT_NUM.toDouble).toInt + SharedConf.get().setInt(MLConf.ML_GBDT_SPLIT_NUM, param.numSplit) + param.numTree = paramMap.getOrElse(MLConf.ML_GBDT_TREE_NUM, + MLConf.DEFAULT_ML_GBDT_TREE_NUM.toDouble).toInt + if (param.isMultiClassMultiTree) param.numTree *= param.numClass + SharedConf.get().setInt(MLConf.ML_GBDT_TREE_NUM, param.numTree) + param.maxDepth = paramMap.getOrElse(MLConf.ML_GBDT_TREE_DEPTH, + MLConf.DEFAULT_ML_GBDT_TREE_DEPTH.toDouble).toInt + SharedConf.get().setInt(MLConf.ML_GBDT_TREE_DEPTH, param.maxDepth) + val maxNodeNum = Maths.pow(2, param.maxDepth + 1) - 1 + param.maxNodeNum = paramMap.getOrElse(MLConf.ML_GBDT_MAX_NODE_NUM, 4096.toDouble).toInt min maxNodeNum + SharedConf.get().setInt(MLConf.ML_GBDT_MAX_NODE_NUM, param.maxNodeNum) + + // less important algo conf + param.minChildWeight = paramMap.getOrElse(MLConf.ML_GBDT_MIN_CHILD_WEIGHT, + MLConf.DEFAULT_ML_GBDT_MIN_CHILD_WEIGHT).toFloat + param.minNodeInstance = paramMap.getOrElse(MLConf.ML_GBDT_MIN_NODE_INSTANCE, + MLConf.DEFAULT_ML_GBDT_MIN_NODE_INSTANCE.toDouble).toInt + param.minSplitGain = paramMap.getOrElse(MLConf.ML_GBDT_MIN_SPLIT_GAIN, + MLConf.DEFAULT_ML_GBDT_MIN_SPLIT_GAIN).toFloat + param.regAlpha = paramMap.getOrElse(MLConf.ML_GBDT_REG_ALPHA, + MLConf.DEFAULT_ML_GBDT_REG_ALPHA).toFloat + param.regLambda = paramMap.getOrElse(MLConf.ML_GBDT_REG_LAMBDA, + MLConf.DEFAULT_ML_GBDT_REG_LAMBDA).toFloat + param.maxLeafWeight = paramMap.getOrElse(MLConf.ML_GBDT_MAX_LEAF_WEIGHT, + MLConf.DEFAULT_ML_GBDT_MAX_LEAF_WEIGHT).toFloat + + param + } + +} diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/FPGBDTTrainerWrapper.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/FPGBDTTrainerWrapper.scala index 35690ebac..43429d247 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/FPGBDTTrainerWrapper.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/FPGBDTTrainerWrapper.scala @@ -29,11 +29,17 @@ private object FPGBDTTrainerWrapper { private[trainer] def apply(workerId: Int, trainer: FPGBDTTrainer): FPGBDTTrainerWrapper = { trainer.synchronized { + if (trainers.contains(workerId)) trainers.remove(workerId) require(!trainers.contains(workerId), s"Id $workerId already exists") trainers += workerId -> trainer new FPGBDTTrainerWrapper(workerId) } } + + private[trainer] def clear(): Unit = { + println(s"trainers size ${trainers.size}") + trainers.clear() + } } private[trainer] class FPGBDTTrainerWrapper private(private[trainer] val workerId: Int) { diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala index a4d5ceceb..95317dd7d 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/gbdt/trainer/GBDTTrainer.scala @@ -223,6 +223,15 @@ class GBDTTrainer(param: GBDTParam) extends Serializable { private[gbdt] var numTrain: Int = _ private[gbdt] var numValid: Int = _ + def clear(): Unit = { + workers.map { wrapper => + FPGBDTTrainerWrapper.clear() + Iterator.empty + }.collect() + workers.unpersist() + FPGBDTTrainerWrapper.clear() + } + def initialize(trainInput: String, validInput: String) (implicit sc: SparkContext): Unit = { val initStart = System.currentTimeMillis() diff --git a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/split/SplitSet.java b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/split/SplitSet.java index ea2c7c86a..beb5a00ab 100644 --- a/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/split/SplitSet.java +++ b/spark-on-angel/mllib/src/main/scala/com/tencent/angel/spark/ml/tree/split/SplitSet.java @@ -26,6 +26,8 @@ public class SplitSet extends SplitEntry { private float[] edges; private int firstFlow; + // edges=[x,...] firstFlow=1 => go to right if < x and go to left if > x + // edges=[x,...] firstFlow=0 => go to left if < x and go to right if > x private int defaultFlow; public SplitSet() { diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGBDTTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGBDTTest.scala new file mode 100644 index 000000000..7d8e13234 --- /dev/null +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/AutoGBDTTest.scala @@ -0,0 +1,74 @@ +/* + * Tencent is pleased to support the open source community by making Angel available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/Apache-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ + +package com.tencent.angel.spark.ml + +import com.tencent.angel.RunningMode +import com.tencent.angel.conf.AngelConf +import com.tencent.angel.ml.core.conf.{MLConf, SharedConf} +import com.tencent.angel.spark.ml.tree.gbdt.trainer.AutoGBDTLearner + +class AutoGBDTTest extends PSFunSuite with SharedPSContext { + private var learner: AutoGBDTLearner = _ + private var input: String = _ + private var modelPath: String = _ + + override def beforeAll(): Unit = { + super.beforeAll() + + input = "../../data/census/census_148d_train.libsvm" + modelPath = "../../tmp/gbdt" + + // build SharedConf with params + SharedConf.get() + + SharedConf.get().set(AngelConf.ANGEL_TRAIN_DATA_PATH, input) + SharedConf.get().set(AngelConf.ANGEL_VALIDATE_DATA_PATH, input) + SharedConf.get().set(AngelConf.ANGEL_SAVE_MODEL_PATH, modelPath) + + SharedConf.get().set(MLConf.ML_GBDT_TASK_TYPE, "classification") + SharedConf.get().setInt(MLConf.ML_NUM_CLASS, 2) + SharedConf.get().setInt(MLConf.ML_FEATURE_INDEX_RANGE, 149) + SharedConf.get().set(MLConf.ML_GBDT_LOSS_FUNCTION, "binary:logistic") + SharedConf.get().set(MLConf.ML_GBDT_EVAL_METRIC, "auc") + + SharedConf.get().setDouble(MLConf.ML_GBDT_FEATURE_SAMPLE_RATIO, 1.0) + SharedConf.get().setDouble(MLConf.ML_LEARN_RATE, 0.1) + SharedConf.get().setInt(MLConf.ML_GBDT_SPLIT_NUM, 10) + SharedConf.get().setInt(MLConf.ML_GBDT_TREE_NUM, 10) + SharedConf.get().setInt(MLConf.ML_GBDT_TREE_DEPTH, 3) + + SharedConf.get().setInt(MLConf.ML_AUTO_TUNER_ITER, 5) + SharedConf.get().setBoolean(MLConf.ML_AUTO_TUNER_MINIMIZE, false) + SharedConf.get().set(MLConf.ML_AUTO_TUNER_MODEL, "GaussianProcess") + SharedConf.get().set(MLConf.ML_AUTO_TUNER_PARAMS, + "ml.learn.rate|C|double|0.1:1:100#ml.gbdt.tree.num|D|int|2,4,6,8,10") + + SharedConf.get().set(AngelConf.ANGEL_RUNNING_MODE, RunningMode.ANGEL_PS.toString) + + learner = new AutoGBDTLearner().init() + } + + override def afterAll(): Unit = { + super.afterAll() + } + + test("AutoGBDT") { + learner.train(sc) + } + +} diff --git a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala index 04dcb8631..84705c1d4 100644 --- a/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala +++ b/spark-on-angel/mllib/src/test/scala/com/tencent/angel/spark/ml/GBDTTest.scala @@ -65,8 +65,8 @@ class GBDTTest extends PSFunSuite with SharedPSContext { println(s"Model will be saved to $modelPath") trainer.save(model, modelPath)(sc) - predictor.loadModel(sc, modelPath) - predictor.predict(sc, testPath, predPath) + predictor.loadModel(modelPath)(sc) + predictor.predict(testPath, predPath)(sc) } catch { case e: Exception => e.printStackTrace() } finally {