templates.JavaServer.txt.Handler.template.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pekko-grpc-codegen_3 Show documentation
Show all versions of pekko-grpc-codegen_3 Show documentation
Apache Pekko gRPC - Support for building streaming gRPC servers and clients on top of Pekko Streams.
The newest version!
package templates.JavaServer.txt
import _root_.play.twirl.api.TwirlFeatureImports.*
import _root_.play.twirl.api.TwirlHelperImports.*
import scala.language.adhocExtensions
import _root_.play.twirl.api.Html
import _root_.play.twirl.api.JavaScript
import _root_.play.twirl.api.Txt
import _root_.play.twirl.api.Xml
object Handler extends _root_.play.twirl.api.BaseScalaTemplate[play.twirl.api.TxtFormat.Appendable,_root_.play.twirl.api.Format[play.twirl.api.TxtFormat.Appendable]](play.twirl.api.TxtFormat) with _root_.play.twirl.api.Template2[org.apache.pekko.grpc.gen.javadsl.Service,Boolean,play.twirl.api.TxtFormat.Appendable] {
/*
* Copyright (C) 2018-2021 Lightbend Inc.
*/
def apply/*14.2*/(service: org.apache.pekko.grpc.gen.javadsl.Service, powerApis: Boolean):play.twirl.api.TxtFormat.Appendable = {
_display_ {
{
Seq[Any](format.raw/*15.1*/("""
"""),_display_(/*16.2*/org/*16.5*/.apache.pekko.grpc.gen.Constants.DoNotEditComment),format.raw/*16.54*/("""
"""),format.raw/*17.1*/("""package """),_display_(/*17.10*/service/*17.17*/.packageName),format.raw/*17.29*/(""";
import java.util.Iterator;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import org.apache.pekko.japi.function.Function;
import org.apache.pekko.actor.ActorSystem;
import org.apache.pekko.actor.ClassicActorSystemProvider;
import org.apache.pekko.annotation.ApiMayChange;
import org.apache.pekko.stream.Materializer;
import org.apache.pekko.stream.SystemMaterializer;
import org.apache.pekko.grpc.Trailers;
import org.apache.pekko.grpc.javadsl.GrpcMarshalling;
import org.apache.pekko.grpc.javadsl.GrpcExceptionHandler;
import org.apache.pekko.grpc.internal.TelemetryExtension;
import org.apache.pekko.grpc.internal.TelemetrySpi;
import org.apache.pekko.grpc.PekkoGrpcGenerated;
"""),_display_(/*38.2*/{if (powerApis) "import org.apache.pekko.grpc.javadsl.Metadata;\nimport org.apache.pekko.grpc.javadsl.MetadataBuilder;" else ""}),format.raw/*38.130*/("""
"""),format.raw/*40.1*/("""import static """),_display_(/*40.16*/{service.packageName}),format.raw/*40.37*/("""."""),_display_(/*40.39*/{service.name}),format.raw/*40.53*/(""".Serializers.*;
"""),_display_(/*42.2*/defining(if (powerApis) service.name + "PowerApi" else service.name)/*42.70*/ { serviceName =>_display_(Seq[Any](format.raw/*42.87*/("""
"""),format.raw/*43.1*/("""/*
* Generated by Pekko gRPC. DO NOT EDIT.
*
* The API of this class may still change in future Apache Pekko gRPC versions, see for instance
* https://github.com/akka/akka-grpc/issues/994
*/
@ApiMayChange
@PekkoGrpcGenerated
public class """),_display_(/*52.15*/{serviceName}),format.raw/*52.28*/("""HandlerFactory """),format.raw/*52.43*/("""{"""),format.raw/*52.44*/("""
"""),format.raw/*54.5*/("""private static final CompletionStage notFound = CompletableFuture.completedFuture(
org.apache.pekko.http.javadsl.model.HttpResponse.create().withStatus(org.apache.pekko.http.javadsl.model.StatusCodes.NOT_FOUND));
private static final CompletionStage unsupportedMediaType = CompletableFuture.completedFuture(
org.apache.pekko.http.javadsl.model.HttpResponse.create().withStatus(org.apache.pekko.http.javadsl.model.StatusCodes.UNSUPPORTED_MEDIA_TYPE));
/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example `Http().bindAndHandleAsync`
* for the generated partial function handler and ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*64.12*/("""{"""),format.raw/*64.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*64.81*/("""}"""),format.raw/*64.82*/(""" """),format.raw/*64.83*/("""with """),format.raw/*64.88*/("""{"""),format.raw/*64.89*/("""@link """),_display_(/*64.97*/{service.name}),format.raw/*64.111*/("""HandlerFactory#partial"""),format.raw/*64.133*/("""}"""),format.raw/*64.134*/(""" """),format.raw/*64.135*/("""when combining
* several services.
*/
public static Function> create("""),_display_(/*67.152*/serviceName),format.raw/*67.163*/(""" """),format.raw/*67.164*/("""implementation, ClassicActorSystemProvider system) """),format.raw/*67.215*/("""{"""),format.raw/*67.216*/("""
"""),format.raw/*68.7*/("""return create(implementation, """),_display_(/*68.38*/{service.name}),format.raw/*68.52*/(""".name, system);
"""),format.raw/*69.5*/("""}"""),format.raw/*69.6*/("""
"""),format.raw/*71.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example `Http().bindAndHandleAsync`
* for the generated partial function handler and ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*75.12*/("""{"""),format.raw/*75.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*75.81*/("""}"""),format.raw/*75.82*/(""" """),format.raw/*75.83*/("""with """),format.raw/*75.88*/("""{"""),format.raw/*75.89*/("""@link """),_display_(/*75.97*/{service.name}),format.raw/*75.111*/("""HandlerFactory#partial"""),format.raw/*75.133*/("""}"""),format.raw/*75.134*/(""" """),format.raw/*75.135*/("""when combining
* several services.
*/
public static Function> create("""),_display_(/*78.152*/serviceName),format.raw/*78.163*/(""" """),format.raw/*78.164*/("""implementation, org.apache.pekko.japi.Function> eHandler, ClassicActorSystemProvider system) """),format.raw/*78.322*/("""{"""),format.raw/*78.323*/("""
"""),format.raw/*79.7*/("""return create(implementation, """),_display_(/*79.38*/{service.name}),format.raw/*79.52*/(""".name, eHandler, system);
"""),format.raw/*80.5*/("""}"""),format.raw/*80.6*/("""
"""),format.raw/*82.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example `Http().bindAndHandleAsync`
* for the generated partial function handler and ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*86.12*/("""{"""),format.raw/*86.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*86.81*/("""}"""),format.raw/*86.82*/(""" """),format.raw/*86.83*/("""with """),format.raw/*86.88*/("""{"""),format.raw/*86.89*/("""@link """),_display_(/*86.97*/{service.name}),format.raw/*86.111*/("""HandlerFactory#partial"""),format.raw/*86.133*/("""}"""),format.raw/*86.134*/(""" """),format.raw/*86.135*/("""when combining
* several services.
*
* Registering a gRPC service under a custom prefix is not widely supported and strongly discouraged by the specification.
*/
public static Function> create("""),_display_(/*91.152*/serviceName),format.raw/*91.163*/(""" """),format.raw/*91.164*/("""implementation, String prefix, ClassicActorSystemProvider system) """),format.raw/*91.230*/("""{"""),format.raw/*91.231*/("""
"""),format.raw/*92.7*/("""return partial(implementation, prefix, SystemMaterializer.get(system).materializer(), GrpcExceptionHandler.defaultMapper(), system);
"""),format.raw/*93.5*/("""}"""),format.raw/*93.6*/("""
"""),format.raw/*95.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example `Http().bindAndHandleAsync`
* for the generated partial function handler and ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*99.12*/("""{"""),format.raw/*99.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*99.81*/("""}"""),format.raw/*99.82*/(""" """),format.raw/*99.83*/("""with """),format.raw/*99.88*/("""{"""),format.raw/*99.89*/("""@link """),_display_(/*99.97*/{service.name}),format.raw/*99.111*/("""HandlerFactory#partial"""),format.raw/*99.133*/("""}"""),format.raw/*99.134*/(""" """),format.raw/*99.135*/("""when combining
* several services.
*
* Registering a gRPC service under a custom prefix is not widely supported and strongly discouraged by the specification.
*/
public static Function> create("""),_display_(/*104.152*/serviceName),format.raw/*104.163*/(""" """),format.raw/*104.164*/("""implementation, String prefix, org.apache.pekko.japi.Function> eHandler, ClassicActorSystemProvider system) """),format.raw/*104.337*/("""{"""),format.raw/*104.338*/("""
"""),format.raw/*105.7*/("""return partial(implementation, prefix, SystemMaterializer.get(system).materializer(), eHandler, system);
"""),format.raw/*106.5*/("""}"""),format.raw/*106.6*/("""
"""),_display_(if(serviceName != "ServerReflection")/*108.39*/ {_display_(Seq[Any](format.raw/*108.41*/("""
"""),format.raw/*110.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example `Http().bindAndHandleAsync`
* for the generated partial function handler. The generated handler falls back to a reflection handlers for
* `"""),_display_(/*113.10*/{service.name}),format.raw/*113.24*/("""` and ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*115.12*/("""{"""),format.raw/*115.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*115.81*/("""}"""),format.raw/*115.82*/(""" """),format.raw/*115.83*/("""with """),format.raw/*115.88*/("""{"""),format.raw/*115.89*/("""@link """),_display_(/*115.97*/{service.name}),format.raw/*115.111*/("""HandlerFactory#partial"""),format.raw/*115.133*/("""}"""),format.raw/*115.134*/(""" """),format.raw/*115.135*/("""when combining
* several services.
*/
@SuppressWarnings("unchecked")
public static Function> createWithServerReflection("""),_display_(/*119.172*/serviceName),format.raw/*119.183*/(""" """),format.raw/*119.184*/("""implementation, ClassicActorSystemProvider system) """),format.raw/*119.235*/("""{"""),format.raw/*119.236*/("""
"""),format.raw/*120.7*/("""return org.apache.pekko.grpc.javadsl.ServiceHandler.concatOrNotFound(
"""),_display_(/*121.12*/{serviceName}),format.raw/*121.25*/("""HandlerFactory.create(implementation, system),
org.apache.pekko.grpc.javadsl.ServerReflection.create(
java.util.Collections.singletonList("""),_display_(/*123.50*/{service.name}),format.raw/*123.64*/(""".description),
system));
"""),format.raw/*125.5*/("""}"""),format.raw/*125.6*/("""
""")))} else {null} ),format.raw/*127.2*/("""
"""),format.raw/*129.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example
* `Http.get(system).bindAndHandleAsync`. It ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*133.12*/("""{"""),format.raw/*133.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*133.81*/("""}"""),format.raw/*133.82*/(""" """),format.raw/*133.83*/("""when combining several services.
*/
public static Function> partial("""),_display_(/*135.153*/serviceName),format.raw/*135.164*/(""" """),format.raw/*135.165*/("""implementation, String prefix, ClassicActorSystemProvider system) """),format.raw/*135.231*/("""{"""),format.raw/*135.232*/("""
"""),format.raw/*136.7*/("""return partial(implementation, prefix, SystemMaterializer.get(system).materializer(), GrpcExceptionHandler.defaultMapper(), system);
"""),format.raw/*137.5*/("""}"""),format.raw/*137.6*/("""
"""),format.raw/*139.5*/("""/**
* Creates a `HttpRequest` to `HttpResponse` handler that can be used in for example
* `Http.get(system).bindAndHandleAsync`. It ends with `StatusCodes.NotFound` if the request is not matching.
*
* Use """),format.raw/*143.12*/("""{"""),format.raw/*143.13*/("""@link org.apache.pekko.grpc.javadsl.ServiceHandler#concatOrNotFound"""),format.raw/*143.81*/("""}"""),format.raw/*143.82*/(""" """),format.raw/*143.83*/("""when combining several services.
*/
public static Function> partial("""),_display_(/*145.153*/serviceName),format.raw/*145.164*/(""" """),format.raw/*145.165*/("""implementation, String prefix, Materializer mat, org.apache.pekko.japi.Function> eHandler, ClassicActorSystemProvider system) """),format.raw/*145.356*/("""{"""),format.raw/*145.357*/("""
"""),format.raw/*146.7*/("""TelemetrySpi spi = TelemetryExtension.get(system).spi();
return (req -> """),format.raw/*147.22*/("""{"""),format.raw/*147.23*/("""
"""),format.raw/*148.9*/("""Iterator segments = req.getUri().pathSegments().iterator();
if (segments.hasNext() && segments.next().equals(prefix) && segments.hasNext()) """),format.raw/*149.89*/("""{"""),format.raw/*149.90*/("""
"""),format.raw/*150.11*/("""String method = segments.next();
if (segments.hasNext()) return notFound; // we don't allow any random `/prefix/Method/anything/here
else """),format.raw/*152.16*/("""{"""),format.raw/*152.17*/("""
"""),format.raw/*153.13*/("""return handle(spi.onRequest(prefix, method, req), method, implementation, mat, eHandler, system);
"""),format.raw/*154.11*/("""}"""),format.raw/*154.12*/("""
"""),format.raw/*155.9*/("""}"""),format.raw/*155.10*/(""" """),format.raw/*155.11*/("""else """),format.raw/*155.16*/("""{"""),format.raw/*155.17*/("""
"""),format.raw/*156.11*/("""return notFound;
"""),format.raw/*157.9*/("""}"""),format.raw/*157.10*/("""
"""),format.raw/*158.7*/("""}"""),format.raw/*158.8*/(""");
"""),format.raw/*159.5*/("""}"""),format.raw/*159.6*/("""
"""),format.raw/*161.5*/("""public String getServiceName() """),format.raw/*161.36*/("""{"""),format.raw/*161.37*/("""
"""),format.raw/*162.7*/("""return """),_display_(/*162.15*/{service.name}),format.raw/*162.29*/(""".name;
"""),format.raw/*163.5*/("""}"""),format.raw/*163.6*/("""
"""),format.raw/*165.5*/("""private static CompletionStage handle(org.apache.pekko.http.javadsl.model.HttpRequest request, String method, """),_display_(/*165.166*/serviceName),format.raw/*165.177*/(""" """),format.raw/*165.178*/("""implementation, Materializer mat, org.apache.pekko.japi.Function> eHandler, ClassicActorSystemProvider system) """),format.raw/*165.354*/("""{"""),format.raw/*165.355*/("""
"""),format.raw/*166.7*/("""return GrpcMarshalling.negotiated(request, (reader, writer) -> """),format.raw/*166.70*/("""{"""),format.raw/*166.71*/("""
"""),format.raw/*167.9*/("""final CompletionStage response;
"""),_display_(/*168.10*/{if(powerApis) { "Metadata metadata = MetadataBuilder.fromHeaders(request.getHeaders());" } else { "" }}),format.raw/*168.114*/("""
"""),format.raw/*169.9*/("""switch(method) """),format.raw/*169.24*/("""{"""),format.raw/*169.25*/("""
"""),_display_(/*170.12*/for(method <- service.methods) yield /*170.42*/ {_display_(Seq[Any](format.raw/*170.44*/("""
case """"),_display_(/*171.18*/method/*171.24*/.grpcName),format.raw/*171.33*/("""":
response = """),_display_(/*172.25*/{method.unmarshal}),format.raw/*172.43*/("""(request.entity(), """),_display_(/*172.63*/method/*172.69*/.deserializer.name),format.raw/*172.87*/(""", mat, reader)
."""),_display_(/*173.17*/{if(method.outputStreaming) { "thenApply" } else { "thenCompose" }}),format.raw/*173.84*/("""(e -> implementation."""),_display_(/*173.106*/{method.name}),format.raw/*173.119*/("""(e"""),_display_(/*173.122*/{if(powerApis) { ", metadata" } else { "" }}),format.raw/*173.166*/("""))
.thenApply(e -> """),_display_(/*174.32*/{method.marshal}),format.raw/*174.48*/("""(e, """),_display_(/*174.53*/method/*174.59*/.serializer.name),format.raw/*174.75*/(""", writer, system, eHandler));
break;
""")))}),format.raw/*176.12*/("""
"""),format.raw/*177.11*/("""default:
CompletableFuture result = new CompletableFuture<>();
result.completeExceptionally(new UnsupportedOperationException("Not implemented: " + method));
response = result;
"""),format.raw/*181.9*/("""}"""),format.raw/*181.10*/("""
"""),format.raw/*182.9*/("""return response.exceptionally(e -> GrpcExceptionHandler.standard(e, eHandler, writer, system));
"""),format.raw/*183.7*/("""}"""),format.raw/*183.8*/(""")
.orElseGet(() -> unsupportedMediaType);
"""),format.raw/*185.5*/("""}"""),format.raw/*185.6*/("""
"""),format.raw/*186.3*/("""}"""),format.raw/*186.4*/("""
""")))}),format.raw/*187.2*/("""
"""))
}
}
}
def render(service:org.apache.pekko.grpc.gen.javadsl.Service,powerApis:Boolean): play.twirl.api.TxtFormat.Appendable = apply(service,powerApis)
def f:((org.apache.pekko.grpc.gen.javadsl.Service,Boolean) => play.twirl.api.TxtFormat.Appendable) = (service,powerApis) => apply(service,powerApis)
def ref: this.type = this
}
/*
-- GENERATED --
SOURCE: codegen/src/main/twirl/templates/JavaServer/Handler.scala.txt
HASH: f10a37f354df82274245992580602c90b973ecb7
MATRIX: 732->364|898->437|926->439|937->442|1007->491|1035->492|1071->501|1087->508|1120->520|1878->1252|2028->1380|2057->1382|2099->1397|2141->1418|2170->1420|2205->1434|2249->1452|2326->1520|2381->1537|2409->1538|2681->1785|2715->1798|2758->1813|2787->1814|2820->1820|3679->2651|3708->2652|3803->2720|3832->2721|3861->2722|3894->2727|3923->2728|3957->2736|3993->2750|4044->2772|4074->2773|4104->2774|4331->2973|4364->2984|4394->2985|4474->3036|4504->3037|4538->3044|4596->3075|4631->3089|4678->3109|4706->3110|4739->3116|5025->3374|5054->3375|5149->3443|5178->3444|5207->3445|5240->3450|5269->3451|5303->3459|5339->3473|5390->3495|5420->3496|5450->3497|5677->3696|5710->3707|5740->3708|5927->3866|5957->3867|5991->3874|6049->3905|6084->3919|6141->3949|6169->3950|6202->3956|6488->4214|6517->4215|6612->4283|6641->4284|6670->4285|6703->4290|6732->4291|6766->4299|6802->4313|6853->4335|6883->4336|6913->4337|7274->4670|7307->4681|7337->4682|7432->4748|7462->4749|7496->4756|7660->4893|7688->4894|7721->4900|8007->5158|8036->5159|8131->5227|8160->5228|8189->5229|8222->5234|8251->5235|8285->5243|8321->5257|8372->5279|8402->5280|8432->5281|8794->5614|8828->5625|8859->5626|9062->5799|9093->5800|9128->5807|9265->5916|9294->5917|9362->5957|9403->5959|9437->5965|9708->6208|9744->6222|9862->6311|9892->6312|9988->6380|10018->6381|10048->6382|10082->6387|10112->6388|10147->6396|10184->6410|10236->6432|10267->6433|10298->6434|10581->6689|10615->6700|10646->6701|10727->6752|10758->6753|10793->6760|10902->6841|10937->6854|11126->7015|11162->7029|11231->7070|11260->7071|11307->7074|11341->7080|11595->7305|11625->7306|11721->7374|11751->7375|11781->7376|12003->7569|12037->7580|12068->7581|12164->7647|12195->7648|12230->7655|12395->7792|12424->7793|12458->7799|12712->8024|12742->8025|12838->8093|12868->8094|12898->8095|13120->8288|13154->8299|13185->8300|13406->8491|13437->8492|13472->8499|13579->8577|13609->8578|13646->8587|13831->8743|13861->8744|13901->8755|14088->8913|14118->8914|14160->8927|14297->9035|14327->9036|14364->9045|14394->9046|14424->9047|14458->9052|14488->9053|14528->9064|14581->9089|14611->9090|14646->9097|14675->9098|14710->9105|14739->9106|14773->9112|14833->9143|14863->9144|14898->9151|14934->9159|14970->9173|15009->9184|15038->9185|15072->9191|15262->9352|15296->9363|15327->9364|15533->9540|15564->9541|15599->9548|15691->9611|15721->9612|15758->9621|15877->9712|16004->9816|16041->9825|16085->9840|16115->9841|16155->9853|16202->9883|16243->9885|16289->9903|16305->9909|16336->9918|16391->9945|16431->9963|16479->9983|16495->9989|16535->10007|16594->10038|16683->10105|16734->10127|16770->10140|16802->10143|16869->10187|16931->10221|16969->10237|17002->10242|17018->10248|17056->10264|17148->10324|17188->10335|17487->10606|17517->10607|17554->10616|17684->10718|17713->10719|17793->10771|17822->10772|17853->10775|17882->10776|17915->10778
LINES: 17->14|22->15|23->16|23->16|23->16|24->17|24->17|24->17|24->17|45->38|45->38|47->40|47->40|47->40|47->40|47->40|49->42|49->42|49->42|50->43|59->52|59->52|59->52|59->52|61->54|71->64|71->64|71->64|71->64|71->64|71->64|71->64|71->64|71->64|71->64|71->64|71->64|74->67|74->67|74->67|74->67|74->67|75->68|75->68|75->68|76->69|76->69|78->71|82->75|82->75|82->75|82->75|82->75|82->75|82->75|82->75|82->75|82->75|82->75|82->75|85->78|85->78|85->78|85->78|85->78|86->79|86->79|86->79|87->80|87->80|89->82|93->86|93->86|93->86|93->86|93->86|93->86|93->86|93->86|93->86|93->86|93->86|93->86|98->91|98->91|98->91|98->91|98->91|99->92|100->93|100->93|102->95|106->99|106->99|106->99|106->99|106->99|106->99|106->99|106->99|106->99|106->99|106->99|106->99|111->104|111->104|111->104|111->104|111->104|112->105|113->106|113->106|115->108|115->108|117->110|120->113|120->113|122->115|122->115|122->115|122->115|122->115|122->115|122->115|122->115|122->115|122->115|122->115|122->115|126->119|126->119|126->119|126->119|126->119|127->120|128->121|128->121|130->123|130->123|132->125|132->125|134->127|136->129|140->133|140->133|140->133|140->133|140->133|142->135|142->135|142->135|142->135|142->135|143->136|144->137|144->137|146->139|150->143|150->143|150->143|150->143|150->143|152->145|152->145|152->145|152->145|152->145|153->146|154->147|154->147|155->148|156->149|156->149|157->150|159->152|159->152|160->153|161->154|161->154|162->155|162->155|162->155|162->155|162->155|163->156|164->157|164->157|165->158|165->158|166->159|166->159|168->161|168->161|168->161|169->162|169->162|169->162|170->163|170->163|172->165|172->165|172->165|172->165|172->165|172->165|173->166|173->166|173->166|174->167|175->168|175->168|176->169|176->169|176->169|177->170|177->170|177->170|178->171|178->171|178->171|179->172|179->172|179->172|179->172|179->172|180->173|180->173|180->173|180->173|180->173|180->173|181->174|181->174|181->174|181->174|181->174|183->176|184->177|188->181|188->181|189->182|190->183|190->183|192->185|192->185|193->186|193->186|194->187
-- GENERATED --
*/
© 2015 - 2025 Weber Informatics LLC | Privacy Policy