From f9e76dbe2ff2d13a5994cc479d4aea2c8292ff05 Mon Sep 17 00:00:00 2001 From: chrisjstevo Date: Mon, 13 Nov 2023 20:30:38 +0100 Subject: [PATCH] Issue 850 added the first example module test for rpc services (#954) * #850 Refactored example code so that simulation is in its own module * #850 Refactored example code into its own module * #850 updated documentation * #850 organized imports * #850 added first consumer test outline * #850 added ability to create viewport in test easily * #850 added ability to create viewport in test easily * #850 added first example working test calling viewport Rpc call. * #850 renamed test case. * #850 Added example flow for baskets * #850 Added additional example for editRowAction * #850 Added additional methods for editable example. * #850 Added additional methods for editable example. * #850 Added more functionality to the demo basket app. * #850 Added thorough test of basket functionality. * #850 Fixed test assert which accidentally changed contract in test. * #850 Fixed test assert which accidentally changed contract in test. * #850 Fixed test assert which accidentally changed contract in test. * #850 fixed the bad pom definition. * #850 deleted duplicate and not required config and updated semgrep. --- .semgrepignore | 3 + docs/getting_started/developing.md | 2 +- example/basket/pom.xml | 273 ++ .../src/main/resources/static/ftse100.csv | 100 + .../basket/src/main/resources/static/hsi.csv | 81 + .../src/main/resources/static/nasdaq100.csv | 102 + .../src/main/resources/static/sp500.csv | 504 ++++ .../core/module/basket/BasketConstants.scala | 0 .../vuu/core/module/basket/BasketModule.scala | 43 +- .../module/basket/csv/CsvStaticLoader.scala | 10 +- .../module/basket/provider/AlgoProvider.scala | 11 +- .../provider/BasketConstituentProvider.scala | 2 +- .../basket/provider/BasketProvider.scala | 0 .../provider/BasketTradingProvider.scala | 51 + .../module/basket/provider/NullProvider.scala | 0 .../provider/PriceStrategyProvider.scala | 2 +- .../module/basket/service/BasketService.scala | 45 +- .../BasketTradingConstituentJoinService.scala | 13 + .../BasketTradingConstituentService.scala | 12 + .../basket/service/BasketTradingService.scala | 63 + .../core/module/basket/BasketCreateTest.scala | 75 + .../basket/BasketMutateOffMarketTest.scala | 143 + .../module/basket/BasketTestCaseHelper.scala | 27 + .../vuu/core/module/basket/TestService.scala | 25 + .../BasketConstituentProviderTest.scala | 102 + .../vuu/provider/BasketProviderTest.scala | 55 + example/editable/pom.xml | 262 ++ .../core/module/editable/EditableModule.scala | 6 +- .../editable/FixSequenceRpcService.scala | 2 +- .../module/editable/ProcessProvider.scala | 2 +- .../module/editable/ProcessRpcService.scala | 6 +- .../core/module/editable/EditableTest.scala | 78 + .../module/editable/EditableTestModule.scala | 89 + .../core/module/editable/NullProvider.scala | 17 + example/main/pom.xml | 297 ++ .../main/src/main/resources/FilterSpec.txt | 35 + .../main/src/main/resources/application.conf | 3 + .../main}/src/main/resources/certs/cert.pem | 0 .../main}/src/main/resources/certs/key.pem | 0 example/main/src/main/resources/down.gif | Bin 0 -> 76 bytes .../src/main/resources/icon-arrow-right.png | Bin 0 -> 1062 bytes .../src/main/resources/logback-netty.xml | 0 .../src/main/resources/logback-socket.xml | 0 .../src/main/resources/logback-trace.xml | 0 .../main}/src/main/resources/logback.xml | 0 example/main/src/main/resources/right.png | Bin 0 -> 279 bytes .../src/main/resources/sort-arrow-down.gif | Bin 0 -> 76 bytes .../main/src/main/resources/sort-arrow-up.gif | Bin 0 -> 76 bytes .../src/main/resources/static/ftse100.csv | 100 + .../main/src/main/resources/static/hsi.csv | 81 + .../src/main/resources/static/nasdaq100.csv | 102 + .../main/src/main/resources/static/sp500.csv | 504 ++++ .../main/scala/org/finos/vuu/SimulMain.scala | 20 +- example/order/pom.xml | 265 ++ .../core/module/simul/SimulationModule.scala | 39 +- .../simul/provider/ChildOrdersProvider.scala | 4 +- .../simul/provider/OrdersSimulProvider.scala | 4 +- .../provider/ParentChildOrdersModel.scala | 0 .../simul/provider/ParentOrdersProvider.scala | 4 +- .../provider/PermissionedOrdersProvider.scala | 0 .../simul/service/ParentOrdersService.scala | 2 +- .../SimulatedBigInstrumentsProvider.scala | 4 +- .../SimulatedInstrumentProvider.scala | 2 +- .../simulation/SimulatedPricesProvider.scala | 4 +- example/permission/pom.xml | 262 ++ .../vuu/core/module/authn/AuthNModule.scala | 4 +- .../core/module/authn/AuthNRestService.scala | 4 +- .../core/module/authn/VuuAuthHandler.scala | 2 + .../module/auths/OrderPermissionChecker.scala | 4 +- .../core/module/auths/PermissionModule.scala | 0 .../vuu/core/module/auths/PermissionSet.scala | 1 - .../auths/provider/PermissionsProvider.scala | 0 .../auths/service/PermissionsRpcService.scala | 8 +- .../core/module/authn/AuthNServerTest.scala | 16 +- .../auths/PermissionFilteredViewport.scala | 158 + .../core/module/auths/PermissionsTest.scala | 3 +- .../auths/TestFriendlyPermissionChecker.scala | 3 +- example/pom.xml | 33 + example/price/pom.xml | 262 ++ .../vuu/core/module/price/PriceModule.scala | 35 +- .../simulation/SimulatedPricesProvider.scala | 354 +++ .../SimulatedPricesProviderTest.scala | 8 +- .../TestFriendlyJoinTableProvider.scala | 21 + pom.xml | 1 + .../packages/vuu-data/src/inlined-worker.js | 2570 +---------------- vuu/src/main/resources/application.conf | 3 - .../main/resources/issue/size.noset.vuu.log | 232 -- vuu/src/main/resources/issue/size.set.vuu.log | 1010 ------- .../runconfigurations/SimulMain.run.xml | 2 +- vuu/src/main/resources/static/ftse100.csv | 200 +- vuu/src/main/resources/static/hsi.csv | 162 +- vuu/src/main/resources/static/nasdaq100.csv | 2 +- vuu/src/main/resources/static/sp500.csv | 1002 +++---- .../finos/vuu/core/AbstractVuuServer.scala | 18 + .../finos/vuu/core/CoreServerApiHandler.scala | 4 +- .../scala/org/finos/vuu/core/VuuServer.scala | 9 +- .../finos/vuu/core/module/ModuleFactory.scala | 24 +- .../org/finos/vuu/core/module/VsModule.scala | 10 +- .../vuu/net/ClientConnectionCreator.scala | 6 +- .../scala/org/finos/vuu/net/Messages.scala | 7 +- .../net/json/CoreJsonSerializationMixin.scala | 2 + .../vuu/viewport/ViewPortContainer.scala | 4 +- .../vuu/core/module/core/CoreModuleTest.scala | 95 - .../vuu/core/sort/FilterAndSortFixture.scala | 2 +- .../vuu/core/table/TableTestHelper.scala | 20 +- .../BasketConstituentProviderTest.scala | 102 - .../vuu/provider/BasketProviderTest.scala | 55 - .../TestFriendlyJoinTableProvider.scala | 3 +- .../org/finos/vuu/test/TestVuuServer.scala | 106 + .../finos/vuu/test/VuuServerTestCase.scala | 35 + .../org/finos/vuu/test/impl/TestChannel.scala | 136 + .../vuu/test/impl/TestVuuServerImpl.scala | 200 ++ .../finos/vuu/test/rpc/RpcDynamicProxy.scala | 207 ++ .../finos/vuu/util/table/TableAsserts.scala | 14 + .../viewport/CreateViewPortScenarioTest.scala | 174 -- .../finos/vuu/viewport/ViewPortSetup.scala | 61 - .../auths/PermissionFilteredViewport.scala | 96 - .../editable/EditableViewPortTest.scala | 8 +- .../AbstractSessionTestCase.scala | 8 +- .../SessionTableViewportTest.scala | 8 +- 120 files changed, 6178 insertions(+), 5274 deletions(-) create mode 100644 example/basket/pom.xml create mode 100644 example/basket/src/main/resources/static/ftse100.csv create mode 100644 example/basket/src/main/resources/static/hsi.csv create mode 100644 example/basket/src/main/resources/static/nasdaq100.csv create mode 100644 example/basket/src/main/resources/static/sp500.csv rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/BasketConstants.scala (100%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala (83%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala (92%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala (86%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala (97%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketProvider.scala (100%) create mode 100644 example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketTradingProvider.scala rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/provider/NullProvider.scala (100%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala (95%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala (66%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala (87%) rename {vuu => example/basket}/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala (86%) create mode 100644 example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingService.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketCreateTest.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketMutateOffMarketTest.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketTestCaseHelper.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/core/module/basket/TestService.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/provider/BasketConstituentProviderTest.scala create mode 100644 example/basket/src/test/scala/org/finos/vuu/provider/BasketProviderTest.scala create mode 100644 example/editable/pom.xml rename {vuu => example/editable}/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala (93%) rename {vuu => example/editable}/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala (89%) rename {vuu => example/editable}/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala (93%) rename {vuu => example/editable}/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala (70%) create mode 100644 example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTest.scala create mode 100644 example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTestModule.scala create mode 100644 example/editable/src/test/scala/org/finos/vuu/core/module/editable/NullProvider.scala create mode 100644 example/main/pom.xml create mode 100644 example/main/src/main/resources/FilterSpec.txt create mode 100644 example/main/src/main/resources/application.conf rename {vuu => example/main}/src/main/resources/certs/cert.pem (100%) rename {vuu => example/main}/src/main/resources/certs/key.pem (100%) create mode 100644 example/main/src/main/resources/down.gif create mode 100644 example/main/src/main/resources/icon-arrow-right.png rename {vuu => example/main}/src/main/resources/logback-netty.xml (100%) rename {vuu => example/main}/src/main/resources/logback-socket.xml (100%) rename {vuu => example/main}/src/main/resources/logback-trace.xml (100%) rename {vuu => example/main}/src/main/resources/logback.xml (100%) create mode 100644 example/main/src/main/resources/right.png create mode 100644 example/main/src/main/resources/sort-arrow-down.gif create mode 100644 example/main/src/main/resources/sort-arrow-up.gif create mode 100644 example/main/src/main/resources/static/ftse100.csv create mode 100644 example/main/src/main/resources/static/hsi.csv create mode 100644 example/main/src/main/resources/static/nasdaq100.csv create mode 100644 example/main/src/main/resources/static/sp500.csv rename {vuu => example/main}/src/main/scala/org/finos/vuu/SimulMain.scala (94%) create mode 100644 example/order/pom.xml rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala (91%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentChildOrdersModel.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/provider/PermissionedOrdersProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala (95%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala (100%) rename {vuu => example/order}/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala (100%) create mode 100644 example/permission/pom.xml rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala (100%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala (100%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala (92%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala (90%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/auths/PermissionModule.scala (100%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala (99%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/auths/provider/PermissionsProvider.scala (100%) rename {vuu => example/permission}/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala (93%) rename {vuu => example/permission}/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala (98%) create mode 100644 example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionFilteredViewport.scala rename {vuu => example/permission}/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala (99%) rename {vuu/src/test/scala/org/finos/vuu/viewport => example/permission/src/test/scala/org/finos/vuu/core/module}/auths/TestFriendlyPermissionChecker.scala (91%) create mode 100644 example/pom.xml create mode 100644 example/price/pom.xml rename {vuu => example/price}/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala (50%) create mode 100644 example/price/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala rename {vuu => example/price}/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala (95%) create mode 100644 example/price/src/test/scala/org/finos/vuu/provider/simulation/TestFriendlyJoinTableProvider.scala delete mode 100644 vuu/src/main/resources/application.conf delete mode 100644 vuu/src/main/resources/issue/size.noset.vuu.log delete mode 100644 vuu/src/main/resources/issue/size.set.vuu.log create mode 100644 vuu/src/main/scala/org/finos/vuu/core/AbstractVuuServer.scala delete mode 100644 vuu/src/test/scala/org/finos/vuu/core/module/core/CoreModuleTest.scala delete mode 100644 vuu/src/test/scala/org/finos/vuu/provider/BasketConstituentProviderTest.scala delete mode 100644 vuu/src/test/scala/org/finos/vuu/provider/BasketProviderTest.scala rename vuu/src/test/scala/org/finos/vuu/{provider => test}/TestFriendlyJoinTableProvider.scala (90%) create mode 100644 vuu/src/test/scala/org/finos/vuu/test/TestVuuServer.scala create mode 100644 vuu/src/test/scala/org/finos/vuu/test/VuuServerTestCase.scala create mode 100644 vuu/src/test/scala/org/finos/vuu/test/impl/TestChannel.scala create mode 100644 vuu/src/test/scala/org/finos/vuu/test/impl/TestVuuServerImpl.scala create mode 100644 vuu/src/test/scala/org/finos/vuu/test/rpc/RpcDynamicProxy.scala delete mode 100644 vuu/src/test/scala/org/finos/vuu/viewport/CreateViewPortScenarioTest.scala delete mode 100644 vuu/src/test/scala/org/finos/vuu/viewport/auths/PermissionFilteredViewport.scala diff --git a/.semgrepignore b/.semgrepignore index 1c19645e3..af2e78047 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -1,6 +1,9 @@ .github/workflows/release-mvn-central.yml vuu/src/main/resources/certs/key.pem +example/main/src/main/resources/certs/key.pem +example/main/src/main/resources/certs/cert.pem vuu/src/main/resources/www/ws-example.html +example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala vuu-ui/packages/vuu-data/src/array-data-source/group-utils.ts vuu-ui/packages/vuu-datagrid-extras/src/column-expression-input/column-language-parser/walkExpressionTree.ts diff --git a/docs/getting_started/developing.md b/docs/getting_started/developing.md index b1e1e6d28..8189bb1b0 100644 --- a/docs/getting_started/developing.md +++ b/docs/getting_started/developing.md @@ -43,7 +43,7 @@ cd vuu #run the maven compile step mvn compile #cd into vuu, child in repo -cd vuu +cd example/main #The server should now be started on your machine with Simulation module mvn exec:exec ``` diff --git a/example/basket/pom.xml b/example/basket/pom.xml new file mode 100644 index 000000000..4b1f1e1c1 --- /dev/null +++ b/example/basket/pom.xml @@ -0,0 +1,273 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + basket + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + tests + test-jar + test + + + + org.finos.vuu + price + 0.5.09-SNAPSHOT + + + + org.finos.vuu + order + 0.5.09-SNAPSHOT + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/example/basket/src/main/resources/static/ftse100.csv b/example/basket/src/main/resources/static/ftse100.csv new file mode 100644 index 000000000..aa0315f95 --- /dev/null +++ b/example/basket/src/main/resources/static/ftse100.csv @@ -0,0 +1,100 @@ +Symbol,Name,Last Trade,Change,Volume, Weighting +AAL.L,Anglo American PLC,436.35�13:13,�5.35�(1.24%),5799089,0.0278736825813547 +ABF.L,Associated British Foods PLC,"3,435.60�13:12",�7.40�(0.21%),86808,0.000417248060431947 +ADM.L,Admiral Group PLC,"1,627.00�13:13",,86808,0.000417248060431947 +ADN.L,Aberdeen Asset Management PLC,334.00�13:13,�2.50�(0.75%),806880,0.00387831899135251 +AHT.L,Ashtead Group PLC,"1,027.00�13:13",�6.00�(0.59%),331255,0.00159219779580666 +ANTO.L,Antofagasta PLC,484.10�13:13,�11.70�(2.48%),1753976,0.00843059492263598 +ARM.L,ARM Holdings PLC,"1,058.00�13:13",�3.00�(0.28%),475927,0.00228757277736148 +AV.L,Aviva PLC,493.97�13:13,�2.23�(0.45%),2226835,0.0107034211668507 +AZN.L,AstraZeneca PLC,"4,399.50�13:13",�2.50�(0.06%),815133,0.00391798755004232 +BA.L,BAE Systems PLC,478.10�13:13,�4.30�(0.91%),2039934,0.00980506986578636 +BAB.L,Babcock International Group PLC,988.00�13:13,�9.50�(0.97%),209614,0.00100752275066102 +BARC.L,Barclays PLC,226.30�13:13,�1.15�(0.51%),6575664,0.0316063387021032 +BATS.L,British American Tobacco PLC,"3,803.50�13:13",�8.50�(0.22%),465110,0.0022355801929258 +BDEV.L,Barratt Developments PLC,576.00�13:13,�0.50�(0.09%),1044365,0.00501980543997108 +BG.L,BG Group PLC,"1,013.50�13:13",�5.50�(0.55%),1507332,0.00724508516988073 +BKG.L,Berkeley Group Holdings (The) PLC,"3,126.00�13:13",�15.00�(0.48%),95071,0.000456964684744788 +BLND.L,British Land Co PLC,828.06�13:12,�10.44�(1.25%),1802548,0.00866405926683583 +BLT.L,BHP Billiton PLC,881.40�13:13,�4.30�(0.49%),4947287,0.0237794431982097 +BNZL.L,Bunzl PLC,"1,875.40�13:05",�4.60�(0.24%),104541,0.000502482829757812 +BP.L,BP PLC,381.50�13:13,�2.95�(0.78%),10493561,0.0504379547308349 +BRBY.L,Burberry Group PLC,"1,269.00�13:13",�7.00�(0.55%),295647,0.00142104572530785 +BT-A.L,BT Group PLC,489.20�13:13,�3.70�(0.75%),3914982,0.0188176048996174 +CCL.L,Carnival PLC,"3,426.00�13:12",�22.00�(0.64%),86257,0.000414599644602783 +CNA.L,Centrica PLC,212.80�13:13,�0.60�(0.28%),2144540,0.0103078651220939 +CPG.L,Compass Group PLC,"1,054.00�13:08",�5.00�(0.48%),1001167,0.00481217156158961 +CPI.L,Capita PLC,"1,235.00�13:11",�1.00�(0.08%),244591,0.0011756418803464 +CRH.L,CRH PLC,"1,783.20�13:12",�17.80�(0.99%),897325,0.00431304851888186 +DC.L,DIXONS CARPHONE,462.10�13:11,,756906,0.00363811584680332 +DGE.L,Diageo PLC,"1,881.50�13:13",�6.50�(0.34%),756906,0.00363811584680332 +DLG.L,Direct Line Insurance Group PLC,403.80�13:13,�0.40�(0.10%),1095340,0.00526481995338596 +EXPN.L,Experian PLC,"1,191.00�13:12",�2.00�(0.17%),467283,0.00224602485281105 +EZJ.L,easyJet PLC,"1,682.00�13:12",�28.00�(1.64%),1191230,0.00572572121265722 +FRES.L,Fresnillo PLC,678.50�13:12,�6.50�(0.97%),381871,0.00183548675335462 +GFS.L,G4S PLC,232.30�13:03,�2.00�(0.85%),1096551,0.00527064070033535 +GKN.L,GKN PLC,294.80�13:12,�2.50�(0.86%),792247,0.00380798456516713 +GLEN.L,Glencore PLC,90.48�13:13,�1.65�(1.86%),41631528,0.200104533116974 +GSK.L,GlaxoSmithKline PLC,"1,345.00�13:13",�0.50�(0.04%),1767356,0.00849490672625522 +HIK.L,Hikma Pharmaceuticals PLC,"2,010.00�13:04",�57.00�(2.92%),261511,0.00125696891451962 +HL.L,Hargreaves Lansdown PLC,"1,488.03�13:12",�9.97�(0.67%),372261,0.00178929568961912 +HMSO.L,Hammerson PLC,597.50�13:11,�3.50�(0.58%),478301,0.0022989835562697 +HSBA.L,HSBC Holdings PLC,519.70�13:13,�0.50�(0.10%),7415629,0.0356436828072631 +IAG.L,International Consolidated Airlines Group SA,575.40�13:12,�16.10�(2.72%),4311514,0.0207235606629018 +IHG.L,InterContinental Hotels Group PLC,"2,481.00�13:12",�19.00�(0.76%),219918,0.00105704956863507 +III.L,3i Group PLC,487.30�13:11,�4.50�(0.92%),189987,0.000913184352332553 +IMT.L,Imperial Tobacco Group PLC,"3,571.00�13:13",�29.00�(0.81%),926816,0.00445479884777089 +INTU.L,intu properties plc,319.90�13:09,�4.60�(1.42%),514821,0.0024745192115892 +ISAT.L,Inmarsat PLC,"1,054.44�13:13",�3.44�(0.33%),988089,0.00474931133978598 +ITRK.L,Intertek Group PLC,"2,643.00�13:14",�3.00�(0.11%),45868,0.000220467399731505 +ITV.L,ITV PLC,267.30�13:14,�2.60�(0.96%),3453208,0.0165980593985356 +JMAT.L,Johnson Matthey PLC,"2,445.00�13:14",�29.00�(1.20%),276397,0.00132851940096775 +KGF.L,Kingfisher PLC,346.20�13:14,�4.30�(1.23%),1021408,0.00490946118917235 +LAND.L,Land Securities Group PLC,"1,239.00�13:13",�7.00�(0.56%),384973,0.00185039670961971 +LGEN.L,Legal & General Group PLC,266.00�13:14,�1.60�(0.60%),1998399,0.00960542930051541 +LLOY.L,Lloyds Banking Group PLC,73.86�13:14,�0.02�(0.03%),18907878,0.0908818936317375 +LSE.L,London Stock Exchange Group PLC,"2,544.00�13:11",�6.00�(0.24%),129657,0.000623204448569543 +MGGT.L,Meggitt PLC,386.00�13:15,�3.20�(0.84%),611044,0.00293702105610748 +MKS.L,Marks & Spencer Group PLC,514.75�13:12,�3.25�(0.63%),920128,0.00442265255908587 +MNDI.L,Mondi PLC,"1,463.00�13:14",�7.00�(0.48%),383546,0.00184353774521278 +MRW.L,Morrison (Wm) Supermarkets PLC,155.20�13:14,,920128,0.00442265255908587 +NG.L,National Grid PLC,926.40�13:14,�1.10�(0.12%),1659592,0.00797693234619361 +NXT.L,Next PLC,"7,765.00�13:11",�95.00�(1.21%),114062,0.000548246109448308 +OML.L,Old Mutual PLC,198.50�13:14,�0.40�(0.20%),2040849,0.00980946787029396 +PRU.L,Prudential PLC,"1,499.50�13:15",�14.00�(0.93%),580870,0.00279198784516525 +PSON.L,Pearson PLC,794.00�13:09,�5.00�(0.63%),1177953,0.00566190448495522 +RB.L,Reckitt Benckiser Group PLC,"6,293.00�13:14",�34.00�(0.54%),281172,0.0013514707359664 +RBS.L,Royal Bank of Scotland Group PLC,313.40�13:14,�2.40�(0.77%),2100058,0.0100940596177149 +RDSA.L,Royal Dutch Shell PLC,"1,636.00�13:14",�18.00�(1.11%),2467461,0.0118600050276642 +RDSB.L,Royal Dutch Shell PLC,"1,652.00�13:15",�14.50�(0.89%),1457434,0.0070052473240666 +REL.L,Reed Elsevier PLC,"1,170.00�13:14",0.00�(0.00%),908802,0.00436821343443777 +RIO.L,Rio Tinto PLC,"2,235.00�13:15",�21.00�(0.95%),2190722,0.0105298417823887 +RMG.L,Royal Mail PLC,453.50�13:14,�1.20�(0.26%),995316,0.00478404836555252 +RR.L,Rolls-Royce Group PLC,546.63�13:14,�8.38�(1.51%),2792915,0.0134243199555489 +RRS.L,Randgold Resources Ltd,"3,929.00�13:14",0.00�(0.00%),135524,0.000651404549603483 +RSA.L,RSA Insurance Group PLC,437.10�13:14,�0.10�(0.02%),395477,0.00190088484005443 +SAB.L,SABMiller PLC,"4,011.00�13:15",�1.00�(0.02%),892451,0.00428962133421518 +SBRY.L,Sainsbury (J) PLC,255.80�13:14,�7.40�(2.98%),2395670,0.0115149371133421 +SDR.L,Schroders PLC,"2,930.00�13:09",�12.00�(0.41%),44674,0.000214728364341268 +SGE.L,Sage Group (The) PLC,545.50�13:13,�0.50�(0.09%),539717,0.00259418338669419 +SHP.L,Shire PLC,"4,685.00�13:14",�22.00�(0.47%),221318,0.0010637787558598 +SKY.L,SKY,"1,095.00�13:12",�4.00�(0.37%),925016,0.0044461470356248 +SL.L,Standard Life PLC,399.90�13:14,�3.20�(0.79%),861636,0.00414150711683647 +SMIN.L,Smiths Group PLC,992.50�13:14,�27.50�(2.70%),640309,0.00307768510191594 +SN.L,Smith & Nephew PLC,"1,110.00�13:14",�9.00�(0.82%),480018,0.00230723642374461 +SPD.L,Sports Direct International PLC,694.50�13:11,�1.50�(0.22%),157981,0.000759345519250522 +SSE.L,SSE PLC,"1,463.00�13:13",�2.00�(0.14%),562454,0.00270347019378617 +STAN.L,Standard Chartered PLC,583.00�13:14,�0.60�(0.10%),2018697,0.00970299290214945 +STJ.L,St James's Place PLC,964.00�13:14,�11.00�(1.13%),418480,0.00201145019271912 +SVT.L,Severn Trent PLC,"2,199.00�13:12",�1.00�(0.05%),95342,0.000458267263129005 +TPK.L,Travis Perkins PLC,"1,945.00�13:13",�4.00�(0.21%),92916,0.000446606542981001 +TSCO.L,Tesco PLC,171.54�13:14,�2.54�(1.50%),9831136,0.0472539676970174 +TUI.L,TUI AG,"1,115.00�13:10",�5.00�(0.45%),458970,0.00220606790038304 +TW.L,Taylor Wimpey PLC,183.90�13:15,�1.10�(0.59%),3180729,0.0152883721086725 +ULVR.L,Unilever PLC,"2,791.00�13:14",�29.00�(1.03%),824827,0.0039645823650113 +UU.L,United Utilities Group PLC,959.00�13:10,�2.50�(0.26%),436911,0.00210003994253274 +VOD.L,Vodafone Group PLC,224.25�13:15,�1.30�(0.58%),17572036,0.0844610858312637 +WOS.L,Wolseley PLC,"3,657.00�13:14",�4.00�(0.11%),179536,0.000862950969699912 +WPP.L,WPP PLC,"1,502.00�13:15",�12.00�(0.79%),857887,0.0041234873147611 +WTB.L,Whitbread PLC,"4,484.00�13:16",�60.00�(1.32%),141036,0.000677898321019722 +,,,,208048900, diff --git a/example/basket/src/main/resources/static/hsi.csv b/example/basket/src/main/resources/static/hsi.csv new file mode 100644 index 000000000..fcd24d46c --- /dev/null +++ b/example/basket/src/main/resources/static/hsi.csv @@ -0,0 +1,81 @@ +Name,Symbol,Last,Change,Change %,Volume,Turn.,P/E,P/B,Yield,Market Cap,Weighting +CKH HOLDINGS,00001.HK,41.9,1.15,+2.822%,5.15M,215.13M,4.38,0.31,6.98%,160.48B,0.0278736825813547 +CLP HOLDINGS,00002.HK,57.95,-0.1,-0.172%,3.32M,193.19M,156.62,1.39,5.35%,146.41B,0.000417248060431947 +HK & CHINA GAS,00003.HK,5.46,0.13,+2.439%,16.16M,88.00M,19.43,1.66,6.41%,101.88B,0.000417248060431947 +HSBC HOLDINGS,00005.HK,61.7,1.1,+1.815%,22.19M,1.37B,10.54,0.86,4.05%,1,0.00387831899135251 +POWER ASSETS,00006.HK,37.9,-0.25,-0.655%,4.23M,160.75M,14.3,0.93,7.44%,80.77B,0.00159219779580666 +HANG SENG BANK,00011.HK,97.45,2.95,+3.122%,2.54M,247.44M,19.69,1.01,4.21%,186.31B,0.00843059492263598 +HENDERSON LAND,00012.HK,20.65,0.85,+4.293%,5.07M,103.70M,10.81,0.31,8.72%,99.97B,0.00228757277736148 +SHK PPT,00016.HK,83.8,3.25,+4.035%,8.25M,685.41M,10.16,0.4,5.91%,242.83B,0.0107034211668507 +NEW WORLD DEV,00017.HK,15.24,0.8,+5.540%,12.95M,196.19M,30.48,0.18,13.52%,38.35B,0.00391798755004232 +GALAXY ENT,00027.HK,47.15,1.9,+4.199%,11.97M,560.21M,No Profit,3.22,0.00%,206.21B,0.00980506986578636 +MTR CORPORATION,00066.HK,31,0.8,+2.649%,4.68M,144.86M,19.5,1.07,4.23%,192.64B,0.00100752275066102 +HANG LUNG PPT,00101.HK,10.72,0.56,+5.512%,7.68M,81.99M,12.61,0.36,7.28%,48.23B,0.0316063387021032 +GEELY AUTO,00175.HK,9.24,0.17,+1.874%,18.77M,173.30M,16.06,1.15,2.27%,92.99B,0.0022355801929258 +ALI HEALTH,00241.HK,4.88,0.47,+10.658%,53.62M,257.82M,108.09,3.81,0.00%,66.04B,0.00501980543997108 +CITIC,00267.HK,7.2,0.2,+2.857%,11.54M,82.96M,2.78,0.28,9.04%,209.45B,0.00724508516988073 +WH GROUP,00288.HK,4.11,0.08,+1.985%,18.94M,77.65M,4.93,0.7,7.30%,52.73B,0.000456964684744788 +CHINA RES BEER,00291.HK,42.95,1.2,+2.874%,4.83M,207.98M,28.41,4.57,1.41%,139.34B,0.00866405926683583 +OOIL,00316.HK,104.5,-0.4,-0.381%,296.54K,30.98M,0.89,0.66,78.90%,69.01B,0.0237794431982097 +TINGYI,00322.HK,10.94,0.18,+1.673%,2.91M,31.81M,20.75,4.09,9.39%,61.64B,0.000502482829757812 +SINOPEC CORP,00386.HK,4.28,-0.01,-0.233%,92.43M,396.61M,6.94,0.58,9.36%,105.92B,0.0504379547308349 +HKEX,00388.HK,292.6,9,+3.173%,4.61M,1.34B,36.76,7.46,2.44%,370.97B,0.00142104572530785 +TECHTRONIC IND,00669.HK,76,1.35,+1.808%,5.47M,414.78M,16.54,3.43,2.43%,139.45B,0.0188176048996174 +CHINA OVERSEAS,00688.HK,16.24,0.52,+3.308%,13.15M,212.60M,6.76,0.44,4.93%,177.74B,0.000414599644602783 +TENCENT,00700.HK,306.2,8.8,+2.959%,11.25M,3.43B,13.74,3.6,0.78%,2,0.0103078651220939 +CHINA UNICOM,00762.HK,5.68,-0.05,-0.873%,9.23M,52.77M,9.16,0.45,5.44%,173.80B,0.00481217156158961 +LINK REIT,00823.HK,38.4,1.45,+3.924%,12.04M,460.96M,5.42,0.52,7.03%,98.38B,0.0011756418803464 +CHINA RES POWER,00836.HK,14.94,0.32,+2.189%,9.91M,147.81M,10.23,0.87,3.92%,71.87B,0.00431304851888186 +PETROCHINA,00857.HK,5.9,0,0.000%,64.23M,380.44M,6.38,0.7,8.08%,124.48B,0.00363811584680332 +XINYI GLASS,00868.HK,10.14,0.17,+1.705%,3.75M,38.02M,8.01,1.3,6.11%,42.22B,0.00363811584680332 +ZHONGSHENG HLDG,00881.HK,22.05,1.45,+7.039%,6.76M,147.71M,7.08,1.07,4.94%,52.72B,0.00526481995338596 +CNOOC,00883.HK,13.78,-0.02,-0.145%,26.37M,365.08M,4.03,0.97,19.09%,655.47B,0.00224602485281105 +CCB,00939.HK,4.42,0.06,+1.376%,233.61M,1.03B,3.06,0.35,9.93%,1,0.00572572121265722 +CHINA MOBILE,00941.HK,65.7,0.25,+0.382%,7.82M,516.10M,9.91,0.96,6.71%,1,0.00183548675335462 +LONGFOR GROUP,00960.HK,14.08,0.9,+6.829%,10.88M,150.68M,3.06,0.55,9.05%,92.81B,0.00527064070033535 +XINYI SOLAR,00968.HK,5.86,0.28,+5.018%,15.99M,92.88M,13.64,1.75,3.41%,52.17B,0.00380798456516713 +SMIC,00981.HK,20.05,0.25,+1.263%,13.10M,264.32M,11.17,1.06,0.00%,159.31B,0.200104533116974 +LENOVO GROUP,00992.HK,8.07,0.25,+3.197%,33.60M,270.50M,7.61,2.23,4.71%,97.87B,0.00849490672625522 +CKI HOLDINGS,01038.HK,37.05,-0.2,-0.537%,1.44M,53.73M,12.03,0.78,6.83%,93.35B,0.00125696891451962 +HENGAN INT'L,01044.HK,24.95,0.2,+0.808%,2.62M,64.97M,13.35,1.32,6.33%,28.99B,0.00178929568961912 +CHINA SHENHUA,01088.HK,25.4,0.35,+1.397%,7.98M,203.11M,6.14,1.13,11.33%,85.79B,0.0022989835562697 +CSPC PHARMA,01093.HK,5.74,0.05,+0.879%,29.29M,167.41M,9.96,2.01,3.66%,68.32B,0.0356436828072631 +SINOPHARM,01099.HK,22.7,0.2,+0.889%,2.07M,46.80M,7.37,0.92,4.08%,30.46B,0.0207235606629018 +CHINA RES LAND,01109.HK,31.2,1,+3.311%,9.88M,305.88M,7.02,0.81,5.07%,222.49B,0.00105704956863507 +CK ASSET,01113.HK,41.25,1.25,+3.125%,8.57M,352.44M,6.9,0.39,5.53%,146.47B,0.000913184352332553 +SINO BIOPHARM,01177.HK,2.83,0.02,+0.712%,26.30M,74.09M,18.37,1.59,4.24%,53.21B,0.00445479884777089 +CHINA RES MIXC,01209.HK,31.6,1.6,+5.333%,3.07M,96.42M,28.97,4.48,2.87%,72.13B,0.0024745192115892 +BYD COMPANY,01211.HK,242,7,+2.979%,3.90M,938.50M,37.57,5.63,0.53%,265.72B,0.00474931133978598 +AIA,01299.HK,63.85,0.95,+1.510%,38.75M,2.48B,408.88,2.53,2.41%,735.40B,0.000220467399731505 +CHINAHONGQIAO,01378.HK,7.67,0.28,+3.789%,13.05M,99.58M,7.27,0.76,6.65%,72.68B,0.0165980593985356 +ICBC,01398.HK,3.77,0.07,+1.892%,233.48M,881.67M,3.45,0.36,9.08%,327.21B,0.00132851940096775 +XIAOMI-W,01810.HK,12.34,0.62,+5.290%,78.53M,960.98M,109.39,1.9,0.00%,308.83B,0.00490946118917235 +BUD APAC,01876.HK,15.46,0.16,+1.046%,16.17M,250.45M,28.65,2.44,1.91%,204.74B,0.00185039670961971 +SANDS CHINA LTD,01928.HK,24,0.95,+4.121%,19.98M,475.93M,No Profit,N/A,0.00%,194.24B,0.00960542930051541 +CHOW TAI FOOK,01929.HK,11.8,0.28,+2.431%,4.88M,57.68M,21.93,3.64,10.34%,118.00B,0.0908818936317375 +WHARF REIC,01997.HK,30.25,1.4,+4.853%,4.23M,127.31M,No Profit,0.48,4.33%,91.85B,0.000623204448569543 +ANTA SPORTS,02020.HK,88.15,4.4,+5.254%,4.82M,422.51M,27.71,6.16,1.52%,249.70B,0.00293702105610748 +WUXI BIO,02269.HK,45.65,1.55,+3.515%,17.91M,811.49M,38.18,4.88,0.00%,194.01B,0.00442265255908587 +SHENZHOU INTL,02313.HK,75,4.6,+6.534%,5.52M,410.68M,21.87,3.25,2.55%,112.74B,0.00184353774521278 +PING AN,02318.HK,44.85,0.85,+1.932%,23.05M,1.03B,8.28,0.85,6.09%,334.02B,0.00442265255908587 +MENGNIU DAIRY,02319.HK,26.25,1.5,+6.061%,8.58M,223.15M,17.34,2.3,1.73%,103.42B,0.00797693234619361 +LI NING,02331.HK,32.95,1.5,+4.769%,22.54M,738.37M,18.8,3.16,1.58%,86.86B,0.000548246109448308 +SUNNY OPTICAL,02382.HK,54.7,1.05,+1.957%,5.62M,308.60M,22.01,2.44,0.91%,60.00B,0.00980946787029396 +BOC HONG KONG,02388.HK,21.45,0.3,+1.418%,6.53M,140.32M,8.38,0.75,6.33%,226.79B,0.00279198784516525 +CHINA LIFE,02628.HK,12.2,0.24,+2.007%,13.53M,165.07M,9.49,0.7,4.53%,90.78B,0.00566190448495522 +ENN ENERGY,02688.HK,65,1.15,+1.801%,3.06M,198.69M,11.08,1.67,4.48%,73.53B,0.0013514707359664 +ZIJIN MINING,02899.HK,11.98,0.16,+1.354%,16.20M,194.50M,13.97,3.14,1.88%,68.73B,0.0100940596177149 +MEITUAN-W,03690.HK,114.6,3.8,+3.430%,19.17M,2.19B,No Profit,4.89,0.00%,715.43B,0.0118600050276642 +HANSOH PHARMA,03692.HK,10.66,0.16,+1.524%,17.56M,187.72M,21.48,2.47,0.94%,63.25B,0.0070052473240666 +CM BANK,03968.HK,32.7,0.1,+0.307%,11.13M,363.99M,5.51,0.86,6.00%,150.12B,0.00436821343443777 +BANK OF CHINA,03988.HK,2.74,0.05,+1.859%,275.47M,754.54M,3.33,0.33,9.55%,229.13B,0.0105298417823887 +CG SERVICES,06098.HK,8.08,0.25,+3.193%,16.08M,128.87M,12.42,0.65,5.20%,27.01B,0.00478404836555252 +JD HEALTH,06618.HK,40.6,2.95,+7.835%,7.75M,312.36M,299.91,2.56,0.00%,129.12B,0.0134243199555489 +HAIER SMARTHOME,06690.HK,24.65,1.15,+4.894%,7.24M,178.37M,13.83,2.21,2.59%,70.46B,0.000651404549603483 +HAIDILAO,06862.HK,21,0.6,+2.941%,6.86M,143.79M,74.46,13.94,0.55%,117.05B,0.00190088484005443 +JD-SW,09618.HK,115.1,4,+3.600%,7.43M,852.28M,30.73,1.5,6.38%,360.24B,0.00428962133421518 +NONGFU SPRING,09633.HK,45,1.5,+3.448%,3.69M,165.62M,52.49,18.63,1.71%,226.56B,0.0115149371133421 +BIDU-SW,09888.HK,133.4,4.6,+3.571%,5.82M,772.73M,47.3,1.5,0.00%,377.37B,0.000214728364341268 +TRIP.COM-S,09961.HK,279.2,7,+2.572%,1.25M,349.59M,114.05,1.4,0.00%,176.65B,0.00259418338669419 +BABA-SW,09988.HK,85.6,2.6,+3.133%,34.61M,2.96B,21.65,1.62,0.00%,1,0.0010637787558598 +NTES-S,09999.HK,159.5,8.3,+5.489%,5.02M,797.10M,22.7,4.63,1.36%,546.99B,0.0044461470356248 diff --git a/example/basket/src/main/resources/static/nasdaq100.csv b/example/basket/src/main/resources/static/nasdaq100.csv new file mode 100644 index 000000000..6447cbb7a --- /dev/null +++ b/example/basket/src/main/resources/static/nasdaq100.csv @@ -0,0 +1,102 @@ +#,Name,Symbol,Weighting,Last Trade,Chg,% Chg +1,Apple Inc,AAPL,11.007,174.94,0.15,(0.09%) +2,Microsoft Corp,MSFT,9.61,316.98,-0.03,(-0.01%) +3,Amazon.com Inc,AMZN,5.401,129.31,0.19,(0.14%) +4,NVIDIA Corp,NVDA,4.101,415.74,-0.36,(-0.09%) +5,Meta Platforms Inc,META,3.729,299.42,0.34,(0.11%) +6,Tesla Inc,TSLA,3.285,244.13,-0.75,(-0.31%) +7,Alphabet Inc,GOOGL,3.133,130.49,0.24,(0.18%) +8,Alphabet Inc,GOOG,3.085,131.49,0.24,(0.18%) +9,Broadcom Inc,AVGO,2.896,833.04,3.96,(0.48%) +10,Costco Wholesale Corp,COST,2.137,557.85,-0.74,(-0.13%) +11,PepsiCo Inc,PEP,2.096,174.84,-0.43,(-0.25%) +12,Adobe Inc,ADBE,2.033,511.42,-1.48,(-0.29%) +13,Cisco Systems Inc,CSCO,1.887,53.68,0.11,(0.20%) +14,Comcast Corp,CMCSA,1.633,45.30,-0.01,(-0.01%) +15,Netflix Inc,NFLX,1.478,379.89,0.08,(0.02%) +16,T-Mobile US Inc,TMUS,1.43,140.18,0.83,(0.60%) +17,Advanced Micro Devices Inc,AMD,1.348,96.09,-0.11,(-0.12%) +18,Texas Instruments Inc,TXN,1.264,161.00,0.69,(0.43%) +19,Intel Corp,INTC,1.26,34.19,0.01,(0.01%) +20,Amgen Inc,AMGN,1.251,271.18,3.48,(1.30%) +21,Intuit Inc,INTU,1.226,509.00,0.43,(0.08%) +22,Honeywell International Inc,HON,1.103,188.67,-1.12,(-0.59%) +23,QUALCOMM Inc,QCOM,1.046,107.53,-0.16,(-0.14%) +24,Applied Materials Inc,AMAT,0.982,136.32,0.15,(0.11%) +25,Booking Holdings Inc,BKNG,0.941,3,019.20,-43.30,(-1.42%) +26,Starbucks Corp,SBUX,0.926,93.80,0.12,(0.12%) +27,Intuitive Surgical Inc,ISRG,0.867,288.50,0.30,(0.10%) +28,Automatic Data Processing Inc,ADP,0.854,239.45,0.10,(0.04%) +29,Mondelez International Inc,MDLZ,0.835,71.25,0.82,(1.16%) +30,Gilead Sciences Inc,GILD,0.814,75.47,0.46,(0.61%) +31,Vertex Pharmaceuticals Inc,VRTX,0.794,353.67,4.14,(1.18%) +32,Regeneron Pharmaceuticals Inc,REGN,0.763,828.09,3.25,(0.39%) +33,Analog Devices Inc,ADI,0.752,176.82,1.34,(0.76%) +34,Lam Research Corp,LRCX,0.702,620.00,0.89,(0.14%) +35,Micron Technology Inc,MU,0.646,68.90,0.02,(0.03%) +36,Palo Alto Networks Inc,PANW,0.604,228.70,0.19,(0.08%) +37,Synopsys Inc,SNPS,0.587,447.12,0.27,(0.06%) +38,Charter Communications Inc,CHTR,0.581,441.88,-3.33,(-0.75%) +39,MercadoLibre Inc,MELI,0.562,1,275.50,-1.47,(-0.11%) +40,PayPal Holdings Inc,PYPL,0.559,57.90,0.02,(0.03%) +41,CSX Corp,CSX,0.54,31.23,0.03,(0.09%) +42,Cadence Design Systems Inc,CDNS,0.539,230.83,0.17,(0.07%) +43,KLA Corp,KLAC,0.53,456.11,4.29,(0.95%) +44,PDD Holdings Inc ADR,PDD,0.521,95.93,-0.01,(-0.01%) +45,Marriott International Inc/MD,MAR,0.505,193.90,-0.46,(-0.23%) +46,Monster Beverage Corp,MNST,0.498,54.48,-0.04,(-0.08%) +47,Airbnb Inc,ABNB,0.491,132.09,-0.11,(-0.08%) +48,O'Reilly Automotive Inc,ORLY,0.485,936.67,0.65,(0.07%) +49,Cintas Corp,CTAS,0.446,505.27,0.52,(0.10%) +50,ASML Holding NV,ASML,0.438,585.00,-2.10,(-0.36%) +51,NXP Semiconductors NV,NXPI,0.434,196.76,-0.04,(-0.02%) +52,Workday Inc,WDAY,0.414,235.55,4.73,(2.05%) +53,Lululemon Athletica Inc,LULU,0.405,386.36,-1.69,(-0.44%) +54,Keurig Dr Pepper Inc,KDP,0.404,33.25,0.13,(0.39%) +55,Fortinet Inc,FTNT,0.401,58.29,0.05,(0.09%) +56,Marvell Technology Inc,MRVL,0.388,52.38,0.08,(0.14%) +57,PACCAR Inc,PCAR,0.38,84.97,0.04,(0.04%) +58,Old Dominion Freight Line Inc,ODFL,0.38,401.01,0.35,(0.09%) +59,Autodesk Inc,ADSK,0.379,204.07,0.03,(0.01%) +60,Kraft Heinz Co/The,KHC,0.368,34.27,0.11,(0.31%) +61,Microchip Technology Inc,MCHP,0.36,77.00,-0.08,(-0.10%) +62,Copart Inc,CPRT,0.358,43.26,0.10,(0.22%) +63,American Electric Power Co Inc,AEP,0.357,79.23,0.06,(0.08%) +64,Paychex Inc,PAYX,0.355,113.01,0.06,(0.06%) +65,Exelon Corp,EXC,0.35,40.28,0.07,(0.16%) +66,ON Semiconductor Corp,ON,0.341,93.87,0.06,(0.06%) +67,AstraZeneca PLC ADR,AZN,0.339,67.35,-0.49,(-0.72%) +68,Seagen Inc,SGEN,0.336,212.18,-1.52,(-0.71%) +69,Ross Stores Inc,ROST,0.335,111.71,0.05,(0.04%) +70,Moderna Inc,MRNA,0.331,100.32,0.33,(0.33%) +71,Biogen Inc,BIIB,0.326,257.93,0.25,(0.10%) +72,Crowdstrike Holdings Inc,CRWD,0.319,162.85,0.28,(0.17%) +73,IDEXX Laboratories Inc,IDXX,0.316,439.41,3.72,(0.85%) +74,Baker Hughes Co,BKR,0.307,35.44,0.04,(0.10%) +75,Constellation Energy Corp,CEG,0.307,110.41,0.05,(0.04%) +76,Cognizant Technology Solutions Corp,CTSH,0.303,70.19,0.58,(0.83%) +77,Verisk Analytics Inc,VRSK,0.303,242.05,0.10,(0.04%) +78,Dexcom Inc,DXCM,0.3,88.30,0.80,(0.92%) +79,Trade Desk Inc/The,TTD,0.293,76.38,0.03,(0.03%) +80,Xcel Energy Inc,XEL,0.284,59.76,0.03,(0.04%) +81,Electronic Arts Inc,EA,0.279,118.38,-0.63,(-0.53%) +82,CoStar Group Inc,CSGP,0.277,78.18,0.12,(0.15%) +83,GLOBALFOUNDRIES Inc,GFS,0.273,57.21,0.38,(0.67%) +84,Fastenal Co,FAST,0.268,54.32,0.11,(0.20%) +85,Atlassian Corp,TEAM,0.253,196.01,0.55,(0.28%) +86,GE HealthCare Technologies Inc,GEHC,0.252,63.78,-0.56,(-0.86%) +87,Warner Bros Discovery Inc,WBD,0.244,11.09,-0.02,(-0.14%) +88,Diamondback Energy Inc,FANG,0.235,150.70,0.13,(0.09%) +89,Datadog Inc,DDOG,0.23,88.81,0.05,(0.06%) +90,ANSYS Inc,ANSS,0.227,300.60,-2.31,(-0.76%) +91,eBay Inc,EBAY,0.203,43.22,0.09,(0.20%) +92,Dollar Tree Inc,DLTR,0.201,104.77,0.27,(0.25%) +93,Align Technology Inc,ALGN,0.2,297.25,-1.31,(-0.44%) +94,Zscaler Inc,ZS,0.188,151.80,0.09,(0.06%) +95,Illumina Inc,ILMN,0.183,132.31,-0.13,(-0.10%) +96,Walgreens Boots Alliance Inc,WBA,0.161,21.18,0.06,(0.28%) +97,Zoom Video Communications Inc,ZM,0.151,68.57,-0.29,(-0.41%) +98,Enphase Energy Inc,ENPH,0.148,120.41,0.49,(0.41%) +99,Sirius XM Holdings Inc,SIRI,0.137,4.05,0.02,(0.50%) +100,JD.com Inc ADR,JD,0.117,30.43,0.02,(0.05%) +101,Lucid Group Inc,LCID,0.102,5.14,0.03,(0.49%) \ No newline at end of file diff --git a/example/basket/src/main/resources/static/sp500.csv b/example/basket/src/main/resources/static/sp500.csv new file mode 100644 index 000000000..19701b2cc --- /dev/null +++ b/example/basket/src/main/resources/static/sp500.csv @@ -0,0 +1,504 @@ +#,Name,Symbol,Weighting,Price,Change,Change %, +1,Apple Inc,AAPL,6.992488,171.9,1.47,(0.86%), +2,Microsoft Corp,MSFT,6.487978,314.55,1.76,(0.56%), +3,Amazon.com Inc,AMZN,3.193379,126.25,0.27,(0.22%), +4,Nvidia Corp,NVDA,2.928461,433.11,8.43,(1.99%), +5,Alphabet Inc Cl A,GOOGL,2.162218,132.93,2.39,(1.83%), +6,Tesla Inc,TSLA,1.854311,246.56,6.06,(2.52%), +7,Alphabet Inc Cl C,GOOG,1.85251,133.81,2.35,(1.78%), +8,Meta Platforms Inc Class A,META,1.847731,305.93,8.19,(2.75%), +9,Berkshire Hathaway Inc Cl B,BRK.B,1.82184,358.67,0.89,(0.25%), +10,Exxon Mobil Corp,XOM,1.343563,118.97,-1.23,(-1.03%), +11,Unitedhealth Group Inc,UNH,1.302884,510.04,6.31,(1.25%), +12,Eli Lilly & Co,LLY,1.224046,546.65,-3.11,(-0.57%), +13,Jpmorgan Chase & Co,JPM,1.182918,148.23,2.45,(1.68%), +14,Johnson & Johnson W/d,JNJ,1.056344,156.83,-0.28,(-0.18%), +15,Visa Inc Class a Shares,V,1.029636,231.97,2.47,(1.08%), +16,Procter & Gamble Co,PG,0.969793,145.75,-1.59,(-1.08%), +17,Broadcom Inc,AVGO,0.941177,835.33,18.52,(2.27%), +18,Mastercard Inc A,MA,0.918779,400.65,5.17,(1.31%), +19,Chevron Corp,CVX,0.847353,170.55,-0.49,(-0.28%), +20,Home Depot Inc,HD,0.847289,304.35,2.53,(0.84%), +22,Abbvie Inc,ABBV,0.754672,152.14,-0.99,(-0.65%), +23,Merck & Co. Inc.,MRK,0.736434,104.2,0.26,(0.25%), +24,Costco Wholesale Corp,COST,0.697258,569.05,5.52,(0.98%), +25,Pepsico Inc,PEP,0.651768,168.92,-0.65,(-0.38%), +26,Walmart Inc,WMT,0.644449,161.87,0.15,(0.09%), +27,Adobe Inc,ADBE,0.639652,507.17,4.57,(0.91%), +28,Coca Cola Co,KO,0.60801,55.82,-0.13,(-0.23%), +29,Cisco Systems Inc,CSCO,0.605326,53.97,0.77,(1.44%), +30,Accenture Plc Cl A,ACN,0.55372,298.5,-15.9,(-5.05%), +31,Salesforce Inc,CRM,0.551342,204.46,1.73,(0.85%), +32,Thermo Fisher Scientific Inc,TMO,0.536951,503.47,5.18,(1.04%), +33,Mcdonald S Corp,MCD,0.536457,265.83,2.19,(0.83%), +34,Bank of America Corp,BAC,0.526405,27.51,0.24,(0.86%), +35,Comcast Corp Class A,CMCSA,0.512537,45.17,0.57,(1.27%), +36,Linde Plc,LIN,0.506835,375.48,3.47,(0.93%), +37,Pfizer Inc,PFE,0.506043,32.09,-0.02,(-0.05%), +38,Netflix Inc,NFLX,0.467192,377.77,0.18,(0.05%), +39,Abbott Laboratories,ABT,0.462893,97.52,1.99,(2.08%), +40,Oracle Corp,ORCL,0.459877,106.29,1.67,(1.60%), +41,Danaher Corp,DHR,0.454026,248.24,0.8,(0.32%), +42,Advanced Micro Devices,AMD,0.442473,103.74,5.67,(5.78%), +43,Wells Fargo & Co,WFC,0.417428,41.04,0.18,(0.43%), +44,Conocophillips,COP,0.411569,123.32,0.23,(0.18%), +45,Walt Disney Co,DIS,0.408438,80.35,0.45,(0.56%), +46,Intel Corp,INTC,0.404462,35.5,0.89,(2.56%), +47,Amgen Inc,AMGN,0.401904,270.91,1.93,(0.72%), +48,Texas Instruments Inc,TXN,0.400931,160.98,2.84,(1.80%), +49,Intuit Inc,INTU,0.397406,515.11,6.87,(1.35%), +50,Philip Morris International,PM,0.39143,92.66,2.34,(2.59%), +51,Caterpillar Inc,CAT,0.388444,276.34,3.63,(1.33%), +52,Verizon Communications Inc,VZ,0.380327,32.56,0.16,(0.48%), +53,Intl Business Machines Corp,IBM,0.364246,140.89,-2.28,(-1.59%), +54,Honeywell International Inc,HON,0.348317,188.68,0.8,(0.43%), +55,Union Pacific Corp,UNP,0.344419,203.88,1.48,(0.73%), +56,Qualcomm Inc,QCOM,0.340195,111.55,2.36,(2.16%), +57,Nextera Energy Inc,NEE,0.338809,57.64,-2.32,(-3.88%), +58,Lowe S Cos Inc,LOW,0.338613,209.52,2.56,(1.24%), +59,Bristol Myers Squibb Co,BMY,0.337683,58.3,0.41,(0.70%), +60,General Electric Co,GE,0.336989,112.43,1.54,(1.39%), +61,S&p Global Inc,SPGI,0.32985,369.21,6.15,(1.69%), +62,Applied Materials Inc,AMAT,0.316678,139.15,4.09,(3.03%), +63,Servicenow Inc,NOW,0.3112,552.84,6.46,(1.18%), +64,Boeing Co,BA,0.309673,193.12,-2.34,(-1.20%), +65,United Parcel Service Cl B,UPS,0.307795,154.29,1.88,(1.23%), +66,Booking Holdings Inc,BKNG,0.307126,3,86.26,3.6,(0.12%) +67,Nike Inc Cl B,NKE,0.305871,89.63,0.21,(0.24%), +68,At&t Inc,T,0.296603,14.94,0.07,(0.44%), +69,Goldman Sachs Group Inc,GS,0.296356,325.72,3.77,(1.17%), +70,Rtx Corp,RTX,0.296189,72.54,-0.34,(-0.46%), +71,Elevance Health Inc,ELV,0.292632,448.99,4.23,(0.95%), +72,Deere & Co,DE,0.291602,388.36,4,(1.04%), +73,Starbucks Corp,SBUX,0.291579,91.21,0.04,(0.04%), +74,Morgan Stanley,MS,0.29087,82.34,0.69,(0.84%), +75,Medtronic Plc,MDT,0.290688,78.77,0.55,(0.71%), +76,Prologis Inc,PLD,0.286912,112.3,1.05,(0.94%), +77,Intuitive Surgical Inc,ISRG,0.285764,296.31,4.88,(1.67%), +78,Tjx Companies Inc,TJX,0.282733,89.27,1.16,(1.32%), +79,Automatic Data Processing,ADP,0.279113,243.79,1.16,(0.48%), +80,Marsh & Mclennan Cos,MMC,0.266169,193.53,0.55,(0.29%), +81,Mondelez International Inc A,MDLZ,0.26425,69.44,-0.56,(-0.79%), +82,Gilead Sciences Inc,GILD,0.26285,75.96,0.41,(0.54%), +83,Lockheed Martin Corp,LMT,0.255775,410.4,1.68,(0.41%), +84,Blackrock Inc,BLK,0.252096,645.37,1.98,(0.31%), +85,Vertex Pharmaceuticals Inc,VRTX,0.251521,353.91,4.26,(1.22%), +86,Stryker Corp,SYK,0.250789,273.07,6.53,(2.45%), +87,Cvs Health Corp,CVS,0.250255,70.11,0.33,(0.47%), +88,Regeneron Pharmaceuticals,REGN,0.2481,835.67,3.11,(0.37%), +89,American Express Co,AXP,0.243515,150.42,0.52,(0.34%), +90,Chubb Ltd,CB,0.242706,212.92,1.29,(0.61%), +91,Analog Devices Inc,ADI,0.241943,177.01,4.2,(2.43%), +92,Schlumberger Ltd,SLB,0.241232,61.02,0.22,(0.36%), +93,Eaton Corp Plc,ETN,0.238556,216.42,2.06,(0.96%), +94,The Cigna Group,CI,0.238517,291.43,2.82,(0.98%), +95,Progressive Corp,PGR,0.229854,140.76,0.14,(0.10%), +96,Lam Research Corp,LRCX,0.228483,627.46,13.54,(2.20%), +97,Schwab (Charles) Corp,SCHW,0.225784,54.57,0.19,(0.35%), +98,Zoetis Inc,ZTS,0.224522,174.68,0,(-0.00%), +99,Citigroup Inc,C,0.217552,41.24,0.78,(1.92%), +100,Boston Scientific Corp,BSX,0.213003,53.3,1.2,(2.31%), +101,Blackstone Inc,BX,0.211158,108.88,2.33,(2.19%), +102,Eog Resources Inc,EOG,0.21104,130.56,0.75,(0.57%), +103,Becton Dickinson and Co,BDX,0.209627,262.6,3.8,(1.47%), +104,Micron Technology Inc,MU,0.208276,66.25,-1.96,(-2.87%), +105,American Tower Corp,AMT,0.207727,160.73,1.04,(0.65%), +106,Altria Group Inc,MO,0.207666,42.11,0.2,(0.47%), +107,T Mobile Us Inc,TMUS,0.20192,140.3,0.6,(0.43%), +108,Cme Group Inc,CME,0.201368,200.22,-0.14,(-0.07%), +109,Southern Co,SO,0.20116,65.04,-1.1,(-1.67%), +110,Palo Alto Networks Inc,PANW,0.198047,236.42,4.52,(1.95%), +111,Duke Energy Corp,DUK,0.193827,88.87,-1.23,(-1.36%), +112,Fiserv Inc,FI,0.192662,113.67,0.48,(0.42%), +113,Synopsys Inc,SNPS,0.189768,458.88,12.17,(2.72%), +114,Activision Blizzard Inc,ATVI,0.18717,93.71,-0.22,(-0.23%), +115,Aon Plc Class A,AON,0.186896,330.04,0.12,(0.04%), +116,Equinix Inc,EQIX,0.184757,715.84,8.74,(1.24%), +117,Illinois Tool Works,ITW,0.177501,233.17,0.77,(0.33%), +118,Air Products & Chemicals Inc,APD,0.17678,289.15,3.89,(1.36%), +119,Paypal Holdings Inc,PYPL,0.175802,58.3,0.96,(1.67%), +120,Cadence Design Sys Inc,CDNS,0.175052,235.09,4.44,(1.93%), +121,Northrop Grumman Corp,NOC,0.173654,441.3,4.06,(0.93%), +122,Intercontinental Exchange In,ICE,0.172998,109.93,1.66,(1.53%), +123,Humana Inc,HUM,0.170476,495.73,2.16,(0.44%), +124,Marathon Petroleum Corp,MPC,0.170186,155.28,2.85,(1.87%), +125,Kla Corp,KLAC,0.170079,459.61,14.05,(3.15%), +126,Fedex Corp,FDX,0.169747,266.99,4.28,(1.63%), +127,Csx Corp,CSX,0.169632,30.62,0.34,(1.14%), +128,Mckesson Corp,MCK,0.167376,445.58,1.2,(0.27%), +129,Sherwin Williams Co,SHW,0.165389,254.95,4.33,(1.73%), +130,Colgate Palmolive Co,CL,0.164,71.11,0.06,(0.08%), +131,Airbnb Inc Class A,ABNB,0.159553,137.66,3.63,(2.70%), +132,Waste Management Inc,WM,0.15893,154.17,-0.25,(-0.16%), +133,Emerson Electric Co,EMR,0.154857,97.31,0.45,(0.47%), +134,O Reilly Automotive Inc,ORLY,0.154194,918.15,3.98,(0.44%), +135,Pioneer Natural Resources Co,PXD,0.1524,234.43,0.34,(0.14%), +136,Phillips 66,PSX,0.150197,122.81,2.01,(1.66%), +137,Freeport Mcmoran Inc,FCX,0.146185,37.34,0.79,(2.17%), +138,3m Co W/d,MMM,0.144312,93.48,0.02,(0.02%), +139,Roper Technologies Inc,ROP,0.144165,486.61,-0.02,(-0.00%), +140,Valero Energy Corp,VLO,0.141937,147.59,3.64,(2.53%), +141,Nxp Semiconductors Nv,NXPI,0.141583,202.19,5.49,(2.79%), +142,Target Corp,TGT,0.141106,109.31,-0.44,(-0.40%), +143,Parker Hannifin Corp,PH,0.140358,396.29,5.18,(1.32%), +144,Us Bancorp,USB,0.139291,32.59,0.07,(0.20%), +145,General Dynamics Corp,GD,0.139193,223.44,2.44,(1.10%), +146,Chipotle Mexican Grill Inc,CMG,0.139055,1,828.59,22.51,(1.25%) +147,Hca Healthcare Inc,HCA,0.138966,251.59,4.33,(1.75%), +148,Arthur J Gallagher & Co,AJG,0.138231,231.77,1.44,(0.62%), +149,Moody S Corp,MCO,0.138162,319.07,4.56,(1.45%), +150,Amphenol Corp Cl A,APH,0.136941,84.4,2.04,(2.47%), +151,Ford Motor Co,F,0.1362,12.58,0.19,(1.49%), +152,Marriott International Cl A,MAR,0.135619,199.53,5.65,(2.92%), +153,Pnc Financial Services Group,PNC,0.135457,123.09,1.28,(1.05%), +154,Transdigm Group Inc,TDG,0.131273,860.46,8.64,(1.01%), +155,Carrier Global Corp,CARR,0.129065,56.83,1.75,(3.17%), +156,Autozone Inc,AZO,0.128857,2,556.17,15.27,(0.60%) +157,Trane Technologies Plc,TT,0.12759,207.07,7.01,(3.50%), +158,Motorola Solutions Inc,MSI,0.127284,275.18,2.2,(0.81%), +159,Arista Networks Inc,ANET,0.12715,184.23,2.63,(1.45%), +160,Norfolk Southern Corp,NSC,0.124378,197.3,1.08,(0.55%), +161,General Motors Co,GM,0.124282,33.25,0.9,(2.77%), +162,Paccar Inc,PCAR,0.123613,86.12,1.31,(1.54%), +163,Charter Communications Inc A,CHTR,0.123199,442.28,8.86,(2.04%), +164,Hess Corp,HES,0.121942,157.3,-0.74,(-0.47%), +165,Sempra,SRE,0.121909,68.15,-1.26,(-1.81%), +166,Occidental Petroleum Corp,OXY,0.121531,66.03,0.43,(0.66%), +167,American International Group,AIG,0.121272,61.73,0.72,(1.18%), +168,Autodesk Inc,ADSK,0.120711,208.03,5.75,(2.84%), +169,Edwards Lifesciences Corp,EW,0.119074,69.68,-0.43,(-0.62%), +170,Ecolab Inc,ECL,0.118911,169.5,1.63,(0.97%), +171,Public Storage,PSA,0.117206,266.58,1.6,(0.60%), +172,Microchip Technology Inc,MCHP,0.116275,78.91,2.41,(3.15%), +173,Aflac Inc,AFL,0.11627,77.65,0.62,(0.81%), +174,Cintas Corp,CTAS,0.116227,486.83,5.75,(1.19%), +175,Welltower Inc,WELL,0.116157,81.07,0.87,(1.08%), +176,Williams Cos Inc,WMB,0.115685,34.65,0.55,(1.61%), +177,Kimberly Clark Corp,KMB,0.114902,121.11,-0.55,(-0.45%), +178,Archer Daniels Midland Co,ADM,0.114307,76.74,0.38,(0.50%), +179,Msci Inc,MSCI,0.113047,518.97,7.03,(1.37%), +180,Constellation Brands Inc A,STZ,0.112869,251.62,1.03,(0.41%), +181,On Semiconductor,ON,0.111009,95.12,3.07,(3.33%), +182,Metlife Inc,MET,0.110772,63.06,0.26,(0.41%), +183,Monster Beverage Corp,MNST,0.110311,53.31,0.19,(0.35%), +184,Hilton Worldwide Holdings In,HLT,0.109054,153.24,3.88,(2.60%), +185,American Electric Power,AEP,0.108899,74.71,-1.15,(-1.51%), +186,Crown Castle Inc,CCI,0.108512,91.35,1.65,(1.83%), +187,Exelon Corp,EXC,0.107894,38.11,-0.69,(-1.78%), +188,Nucor Corp,NUE,0.107787,158.31,2.6,(1.67%), +189,Travelers Cos Inc,TRV,0.107342,167.42,-0.51,(-0.30%), +190,Dominion Energy Inc,D,0.106001,44.61,-0.86,(-1.88%), +191,Te Connectivity Ltd,TEL,0.105581,123.84,3.4,(2.82%), +192,Halliburton Co,HAL,0.105449,42.18,0.15,(0.37%), +193,Centene Corp,CNC,0.105443,69.87,0.13,(0.18%), +194,Fortinet Inc,FTNT,0.105315,59.07,0.93,(1.59%), +195,Oneok Inc,OKE,0.104854,64.86,0.35,(0.53%), +196,General Mills Inc,GIS,0.104655,63.79,-0.26,(-0.40%), +197,Copart Inc,CPRT,0.104453,43.66,0.61,(1.41%), +198,Paychex Inc,PAYX,0.104412,117.4,0.89,(0.76%), +199,Biogen Inc,BIIB,0.103916,258.95,1.43,(0.55%), +200,Truist Financial Corp,TFC,0.103679,28.15,0.18,(0.63%), +201,Ross Stores Inc,ROST,0.10361,111.18,2.26,(2.07%), +202,Johnson Controls Internation,JCI,0.103601,53.69,-0.85,(-1.55%), +203,Iqvia Holdings Inc,IQV,0.103397,200.11,-2.1,(-1.04%), +204,Capital One Financial Corp,COF,0.101688,96.63,1.14,(1.20%), +205,Baker Hughes Co,BKR,0.101425,36.62,0.37,(1.02%), +206,Idexx Laboratories Inc,IDXX,0.101263,439.37,2.51,(0.57%), +207,Corteva Inc,CTVA,0.100577,50.77,0.02,(0.05%), +208,Dow Inc,DOW,0.100258,50.87,-0.13,(-0.26%), +209,Old Dominion Freight Line,ODFL,0.100037,406.82,6.93,(1.73%), +210,Constellation Energy,CEG,0.099445,109.94,-0.81,(-0.73%), +211,Dexcom Inc,DXCM,0.099384,95.68,3.59,(3.90%), +212,Simon Property Group Inc,SPG,0.098977,108.45,0.26,(0.24%), +213,Digital Realty Trust Inc,DLR,0.098757,117.6,0.76,(0.65%), +214,Realty Income Corp,O,0.098278,49.83,0.17,(0.33%), +215,Kenvue Inc W/i,KVUE,0.097359,20.2,-0.02,(-0.12%), +216,Verisk Analytics Inc,VRSK,0.097203,241.97,2.34,(0.98%), +217,Cognizant Tech Solutions A,CTSH,0.096172,68.15,-0.05,(-0.07%), +218,P G & E Corp,PCG,0.095995,16.36,-0.09,(-0.52%), +219,Prudential Financial Inc,PRU,0.095804,94.93,0.41,(0.43%), +220,Ametek Inc,AME,0.09567,150.03,1.17,(0.79%), +221,Yum Brands Inc,YUM,0.095443,123.55,1.57,(1.29%), +222,Dupont De Nemours Inc,DD,0.094185,74.58,1.11,(1.51%), +223,Ameriprise Financial Inc,AMP,0.093691,332.11,5.16,(1.58%), +224,L3harris Technologies Inc,LHX,0.092512,173.16,-2.04,(-1.16%), +225,Fidelity National Info Serv,FIS,0.09207,56.06,0.52,(0.94%), +226,Sysco Corp,SYY,0.091968,65.99,0.78,(1.20%), +227,Moderna Inc,MRNA,0.091789,100.61,1.17,(1.18%), +228,Bank of New York Mellon Corp,BK,0.091699,42.76,0.59,(1.39%), +229,Agilent Technologies Inc,A,0.091382,111.91,1.41,(1.28%), +230,Otis Worldwide Corp,OTIS,0.091228,80.55,1.2,(1.51%), +231,Rockwell Automation Inc,ROK,0.091103,288.26,3.46,(1.21%), +232,Dr Horton Inc,DHI,0.090974,108.96,1.95,(1.82%), +233,Cummins Inc,CMI,0.090916,232.98,3.03,(1.32%), +234,Estee Lauder Companies Cl A,EL,0.090788,139.94,-0.1,(-0.07%), +235,Kinder Morgan Inc,KMI,0.090175,16.71,0.05,(0.27%), +236,Keurig Dr Pepper Inc,KDP,0.088358,31.51,-0.16,(-0.51%), +237,Fastenal Co,FAST,0.087952,55.72,0.66,(1.21%), +238,Xcel Energy Inc,XEL,0.087474,56.5,-0.71,(-1.25%), +239,Devon Energy Corp,DVN,0.087359,48.84,0,(0.01%), +240,Ww Grainger Inc,GWW,0.086956,704.07,3.96,(0.57%), +241,Costar Group Inc,CSGP,0.086756,77.1,0.75,(0.99%), +242,Cencora Inc,COR,0.086188,183.99,-1.17,(-0.63%), +243,United Rentals Inc,URI,0.085093,454.44,8.22,(1.84%), +244,Hershey Co,HSY,0.084755,201.01,-1.55,(-0.76%), +245,Arch Capital Group Ltd,ACGL,0.083799,81.62,0.54,(0.67%), +246,Ppg Industries Inc,PPG,0.083787,130.49,2.46,(1.92%), +247,Global Payments Inc,GPN,0.083671,116.72,1.47,(1.28%), +248,Consolidated Edison Inc,ED,0.083432,85.06,-1.57,(-1.81%), +249,Newmont Corp,NEM,0.082799,36.78,-0.5,(-1.34%), +250,Republic Services Inc,RSG,0.082765,145.01,0.28,(0.19%), +251,Allstate Corp,ALL,0.08254,112.77,-0.25,(-0.22%), +252,Electronic Arts Inc,EA,0.081213,119.76,1.79,(1.51%), +253,Vici Properties Inc,VICI,0.081127,29.28,0.4,(1.37%), +254,Kroger Co,KR,0.080998,44.96,0.48,(1.07%), +255,Public Service Enterprise Gp,PEG,0.080723,56.88,-1.02,(-1.75%), +256,Lennar Corp A,LEN,0.078759,113.41,1.71,(1.53%), +257,Diamondback Energy Inc,FANG,0.078498,158.01,0.78,(0.50%), +258,West Pharmaceutical Services,WST,0.077362,377.15,1.97,(0.52%), +259,Quanta Services Inc,PWR,0.077074,190.82,0.7,(0.37%), +260,Gartner Inc,IT,0.076911,347.78,-1.41,(-0.40%), +261,Aptiv Plc,APTV,0.0757,99.21,3.35,(3.50%), +262,Vulcan Materials Co,VMC,0.075604,207.6,4,(1.97%), +263,Kraft Heinz Co,KHC,0.075468,33.72,-0.31,(-0.90%), +264,Ge Healthcare Technology,GEHC,0.074734,69.81,1.53,(2.24%), +265,Cdw Corp/de,CDW,0.074375,202.53,3.84,(1.93%), +266,Fortive Corp,FTV,0.072323,74.75,1.16,(1.58%), +267,Ingersoll Rand Inc,IR,0.071683,64.52,1.25,(1.97%), +268,Ansys Inc,ANSS,0.071343,299.19,4.85,(1.65%), +269,Extra Space Storage Inc,EXR,0.071269,120.75,0.24,(0.20%), +270,Wec Energy Group Inc,WEC,0.071007,79.67,-0.91,(-1.12%), +271,Martin Marietta Materials,MLM,0.070759,418,8.05,(1.96%), +272,Edison International,EIX,0.068887,63.92,-1.38,(-2.11%), +273,American Water Works Co Inc,AWK,0.068233,123.27,-3.07,(-2.43%), +274,Warner Bros Discovery Inc,WBD,0.068207,10.89,-0.15,(-1.31%), +275,Lyondellbasell Indu Cl A,LYB,0.067294,94.86,-0.11,(-0.11%), +276,Mettler Toledo International,MTD,0.067028,1,112.26,14.48,(1.32%) +277,Avalonbay Communities Inc,AVB,0.066762,171.85,-0.6,(-0.35%), +278,Delta Air Lines Inc,DAL,0.065781,37.32,0.66,(1.79%), +279,T Rowe Price Group Inc,TROW,0.064996,104.73,1.19,(1.15%), +280,Keysight Technologies In,KEYS,0.064934,133.51,3.11,(2.38%), +281,Zimmer Biomet Holdings Inc,ZBH,0.064476,112.14,1.38,(1.24%), +282,Dollar General Corp,DG,0.064042,105.04,0.7,(0.67%), +283,Corning Inc,GLW,0.064037,30.35,0.29,(0.98%), +284,Ebay Inc,EBAY,0.063728,43.45,0.56,(1.31%), +285,Cbre Group Inc A,CBRE,0.063578,73.84,0.35,(0.48%), +286,Weyerhaeuser Co,WY,0.063312,30.4,-0.64,(-2.05%), +287,Church & Dwight Co Inc,CHD,0.062765,91.68,-0.29,(-0.31%), +288,Cardinal Health Inc,CAH,0.062583,88.18,0.14,(0.16%), +289,Hp Inc,HPQ,0.062013,25.73,0.09,(0.36%), +290,Equifax Inc,EFX,0.061821,185.4,4.68,(2.59%), +291,Tractor Supply Company,TSCO,0.061683,205.07,2.06,(1.02%), +292,Willis Towers Watson Plc,WTW,0.06168,211.96,0.35,(0.17%), +293,Hewlett Packard Enterprise,HPE,0.061499,17.7,0.63,(3.66%), +294,Fair Isaac Corp,FICO,0.061481,890.19,4.58,(0.52%), +295,Dollar Tree Inc,DLTR,0.061287,106.46,1.11,(1.05%), +296,Hartford Financial Svcs Grp,HIG,0.061236,72.24,0.53,(0.73%), +297,Resmed Inc,RMD,0.060853,149.81,1.16,(0.78%), +298,Take Two Interactive Softwre,TTWO,0.060753,139.63,1.85,(1.34%), +299,Royal Caribbean Cruises Ltd,RCL,0.060515,94.38,2.42,(2.64%), +300,Xylem Inc,XYL,0.060192,91.4,1.09,(1.20%), +301,Align Technology Inc,ALGN,0.060095,309.06,7.38,(2.45%), +302,Steris Plc,STE,0.060013,221.57,3.67,(1.69%), +303,Broadridge Financial Solutio,BR,0.059572,181.18,-0.04,(-0.02%), +304,Discover Financial Services,DFS,0.059507,86.35,1.09,(1.28%), +305,State Street Corp,STT,0.059411,67.81,1.03,(1.54%), +306,Sba Communications Corp,SBAC,0.059216,198.11,2.05,(1.05%), +307,Monolithic Power Systems Inc,MPWR,0.058699,457.69,16.51,(3.74%), +308,Illumina Inc,ILMN,0.058584,133.02,-0.28,(-0.21%), +309,Dte Energy Company,DTE,0.058057,98.82,-1.72,(-1.71%), +310,M & T Bank Corp,MTB,0.057846,126.63,2.09,(1.68%), +311,Coterra Energy Inc,CTRA,0.057589,27.48,0.34,(1.23%), +312,Eversource Energy,ES,0.057281,57.54,-1.23,(-2.09%), +313,Genuine Parts Co,GPC,0.055796,142.94,0.63,(0.45%), +314,Equity Residential,EQR,0.055712,58.67,0.23,(0.40%), +315,Entergy Corp,ETR,0.055241,92.23,-1.02,(-1.10%), +316,Dover Corp,DOV,0.055103,141.68,1.09,(0.77%), +317,Ameren Corporation,AEE,0.054981,74.6,-1.51,(-1.98%), +318,Ulta Beauty Inc,ULTA,0.054585,398.17,5.73,(1.46%), +319,Teledyne Technologies Inc,TDY,0.054228,414.36,0.92,(0.22%), +320,Nvr Inc,NVR,0.054188,6,27.42,86.42,(1.45%) +321,Targa Resources Corp,TRGP,0.05408,87.52,0.93,(1.08%), +322,Molina Healthcare Inc,MOH,0.053618,333.09,2.03,(0.61%), +323,Wabtec Corp,WAB,0.053425,108.18,1.35,(1.26%), +324,Fleetcor Technologies Inc,FLT,0.053345,260.14,1.28,(0.49%), +325,Albemarle Corp,ALB,0.053229,172.99,10.36,(6.37%), +326,Baxter International Inc,BAX,0.05272,37.54,0.21,(0.57%), +327,Raymond James Financial Inc,RJF,0.052247,101.39,1.84,(1.85%), +328,Mccormick & Co Non Vtg Shrs,MKC,0.051871,74.55,0.46,(0.63%), +329,Invitation Homes Inc,INVH,0.051153,31.73,0.03,(0.11%), +330,Firstenergy Corp,FE,0.050777,34.56,-0.69,(-1.94%), +331,Laboratory Crp of Amer Hldgs,LH,0.05072,204.23,-0.62,(-0.30%), +332,Howmet Aerospace Inc,HWM,0.050386,46.99,0.91,(1.97%), +333,Verisign Inc,VRSN,0.050215,202.93,2.46,(1.23%), +334,Ppl Corp,PPL,0.04902,23.56,-0.39,(-1.61%), +335,Iron Mountain Inc,IRM,0.047985,59.55,0.56,(0.94%), +336,Jacobs Solutions Inc,J,0.047882,136.45,0.27,(0.20%), +337,Intl Flavors & Fragrances,IFF,0.047868,67.84,0.64,(0.95%), +338,Centerpoint Energy Inc,CNP,0.047827,26.68,-0.48,(-1.75%), +339,Darden Restaurants Inc,DRI,0.047736,143.44,2.01,(1.42%), +340,Hologic Inc,HOLX,0.047358,69.99,0.75,(1.08%), +341,First Solar Inc,FSLR,0.047324,161.9,3.29,(2.07%), +342,Expeditors Intl Wash Inc,EXPD,0.046936,114.74,1.08,(0.95%), +343,Brown & Brown Inc,BRO,0.046675,71.15,0.19,(0.26%), +344,Factset Research Systems Inc,FDS,0.046601,443.66,8.47,(1.95%), +345,Fifth Third Bancorp,FITB,0.046598,25.05,0.19,(0.74%), +346,Ventas Inc,VTR,0.046351,42.18,0.77,(1.85%), +347,Marathon Oil Corp,MRO,0.046321,27.51,0.12,(0.45%), +348,Steel Dynamics Inc,STLD,0.046096,106.96,0.52,(0.48%), +349,Bunge Ltd,BG,0.046038,110.67,1.1,(1.00%), +350,Ptc Inc,PTC,0.045951,140.25,1.78,(1.28%), +351,Everest Group Ltd,EG,0.04587,381.3,-0.42,(-0.11%), +352,Cincinnati Financial Corp,CINF,0.045852,104.4,-0.3,(-0.29%), +353,Enphase Energy Inc,ENPH,0.045679,121.39,1.28,(1.07%), +354,Nasdaq Inc,NDAQ,0.04562,49.07,0.74,(1.52%), +355,Akamai Technologies Inc,AKAM,0.045578,107.75,0.79,(0.74%), +356,Cboe Global Markets Inc,CBOE,0.045525,155.28,0.51,(0.33%), +357,Cf Industries Holdings Inc,CF,0.04496,84.93,1.48,(1.78%), +358,Waters Corp,WAT,0.044936,274.46,2.12,(0.78%), +359,Pultegroup Inc,PHM,0.044848,74.85,1.65,(2.25%), +360,Tyler Technologies Inc,TYL,0.044831,387.74,2.43,(0.63%), +361,Principal Financial Group,PFG,0.044705,72.74,0.74,(1.02%), +362,Clorox Company,CLX,0.04465,128.98,-0.17,(-0.13%), +363,Southwest Airlines Co,LUV,0.044478,27.3,0.49,(1.81%), +364,Regions Financial Corp,RF,0.044397,17.16,0.22,(1.27%), +365,Garmin Ltd,GRMN,0.044336,104.65,1.42,(1.38%), +366,Atmos Energy Corp,ATO,0.044128,106.32,-0.14,(-0.13%), +367,Netapp Inc,NTAP,0.044116,76.49,1.54,(2.05%), +368,Textron Inc,TXT,0.043659,79.27,0.33,(0.41%), +369,Cooper Cos Inc,COO,0.04361,318.15,2.23,(0.71%), +370,Kellogg Co,K,0.043517,58.9,-0.22,(-0.38%), +371,Idex Corp,IEX,0.043484,210.72,3.28,(1.58%), +372,Cms Energy Corp,CMS,0.043476,52.78,-0.57,(-1.07%), +373,Skyworks Solutions Inc,SWKS,0.042974,98.55,2.25,(2.33%), +374,Alexandria Real Estate Equit,ARE,0.042466,99.48,0.59,(0.60%), +375,Hunt (Jb) Transprt Svcs Inc,JBHT,0.042319,186.54,0.95,(0.51%), +376,Las Vegas Sands Corp,LVS,0.042222,45.63,-0.53,(-1.15%), +377,Ball Corp,BALL,0.042202,48.27,0.04,(0.08%), +378,Walgreens Boots Alliance Inc,WBA,0.04215,20.97,-0.06,(-0.26%), +379,Teradyne Inc,TER,0.041494,100.04,3.56,(3.68%), +380,Mid America Apartment Comm,MAA,0.041385,128.55,0.48,(0.37%), +381,Epam Systems Inc,EPAM,0.041006,257.76,0.96,(0.37%), +382,Avery Dennison Corp,AVY,0.040961,183.42,1.39,(0.76%), +383,Omnicom Group,OMC,0.040483,74.6,1.21,(1.65%), +384,Huntington Bancshares Inc,HBAN,0.040444,10.25,0.13,(1.24%), +385,Eqt Corp,EQT,0.040251,40,0.39,(0.99%), +386,Tyson Foods Inc Cl A,TSN,0.040042,49.74,-0.37,(-0.74%), +387,Western Digital Corp,WDC,0.039814,45.5,0.94,(2.11%), +388,Northern Trust Corp,NTRS,0.039557,69.29,0.84,(1.23%), +389,Carnival Corp,CCL,0.039206,14.52,0.54,(3.88%), +390,Expedia Group Inc,EXPE,0.038585,102.75,2.5,(2.49%), +391,United Airlines Holdings Inc,UAL,0.038383,42.84,0.81,(1.94%), +392,Quest Diagnostics Inc,DGX,0.038331,123.71,0.31,(0.25%), +393,Axon Enterprise Inc,AXON,0.03828,195.69,1.04,(0.53%), +394,Packaging Corp of America,PKG,0.038236,152.79,0.9,(0.59%), +395,Revvity Inc,RVTY,0.0378,110.55,1.5,(1.38%), +396,Snap on Inc,SNA,0.037774,257.97,4,(1.58%), +397,Pool Corp,POOL,0.037475,353.56,9.86,(2.87%), +398,Essex Property Trust Inc,ESS,0.03733,210.81,0.07,(0.03%), +399,Domino S Pizza Inc,DPZ,0.037258,382.39,2.18,(0.57%), +400,Amcor Plc,AMCR,0.037101,9.09,0.06,(0.61%), +401,Best Buy Co Inc,BBY,0.037071,68.66,0.29,(0.43%), +402,Apa Corp,APA,0.03662,42.49,0.11,(0.27%), +403,Lamb Weston Holdings Inc,LW,0.036553,91.47,0.09,(0.10%), +404,Wr Berkley Corp,WRB,0.036551,65.21,0.86,(1.33%), +405,Conagra Brands Inc,CAG,0.036484,27.44,-0.1,(-0.35%), +406,Lkq Corp,LKQ,0.036449,49.51,0.72,(1.47%), +407,Jm Smucker Co,SJM,0.035767,124.48,-0.96,(-0.77%), +408,Stanley Black & Decker Inc,SWK,0.035567,83.87,0.97,(1.17%), +409,Synchrony Financial,SYF,0.035241,30.73,0.55,(1.84%), +410,Carmax Inc,KMX,0.035202,71.64,-8.05,(-10.10%), +411,Leidos Holdings Inc,LDOS,0.034943,92.2,0.21,(0.23%), +412,Seagate Technology Holdings,STX,0.034918,65.71,1.42,(2.20%), +413,Paycom Software Inc,PAYC,0.034914,259.42,2.34,(0.91%), +414,Celanese Corp,CE,0.034212,127.11,3.81,(3.09%), +415,Trimble Inc,TRMB,0.034136,52.22,3.01,(6.12%), +416,Alliant Energy Corp,LNT,0.03411,48.06,-0.49,(-1.02%), +417,Citizens Financial Group,CFG,0.033972,26.28,0.52,(2.00%), +418,International Paper Co,IP,0.033961,35.1,0.15,(0.41%), +419,Masco Corp,MAS,0.033414,54.58,1.37,(2.58%), +420,Nordson Corp,NDSN,0.033057,223.81,3.73,(1.69%), +421,Loews Corp,L,0.032942,64.16,0.36,(0.56%), +422,Evergy Inc,EVRG,0.032792,50.48,-0.58,(-1.13%), +423,Mosaic Co,MOS,0.03266,35.63,0.43,(1.22%), +424,Molson Coors Beverage Co B,TAP,0.032624,62.29,-0.12,(-0.19%), +425,Zebra Technologies Corp Cl A,ZBRA,0.03257,236.95,11.04,(4.89%), +426,Viatris Inc,VTRS,0.032115,9.8,0.21,(2.14%), +427,Live Nation Entertainment In,LYV,0.032035,83.73,2.71,(3.34%), +428,Host Hotels & Resorts Inc,HST,0.03173,16.38,0.34,(2.11%), +429,Insulet Corp,PODD,0.031493,166.19,4.49,(2.77%), +430,Match Group Inc,MTCH,0.031269,40.07,0.09,(0.23%), +431,Interpublic Group of Cos Inc,IPG,0.031184,29.12,0.39,(1.35%), +432,Hormel Foods Corp,HRL,0.030887,38.15,-0.19,(-0.48%), +433,Incyte Corp,INCY,0.03067,58.93,-0.18,(-0.30%), +434,Udr Inc,UDR,0.030252,35.67,0.28,(0.79%), +435,Jack Henry & Associates Inc,JKHY,0.030211,150.61,2.17,(1.46%), +436,Kimco Realty Corp,KIM,0.029862,17.73,0.24,(1.34%), +437,Aes Corp,AES,0.029775,15.29,-0.65,(-4.05%), +438,Bio Techne Corp,TECH,0.029742,67.67,0.1,(0.15%), +439,Pentair Plc,PNR,0.029592,65.59,0.87,(1.34%), +440,Rollins Inc,ROL,0.029276,37.64,0.2,(0.52%), +441,Mgm Resorts International,MGM,0.028601,36.76,0.27,(0.74%), +442,Ceridian Hcm Holding Inc,CDAY,0.028589,67.38,0.35,(0.52%), +443,Brown Forman Corp Class B,BF.B,0.028542,56.78,0.14,(0.25%), +444,Nisource Inc,NI,0.028365,24.84,-0.35,(-1.37%), +445,Gen Digital Inc,GEN,0.028124,17.83,-0.07,(-0.37%), +446,C.H. Robinson Worldwide Inc,CHRW,0.028048,86.31,0.02,(0.02%), +447,Camden Property Trust,CPT,0.027984,94.56,-0.32,(-0.34%), +448,Charles River Laboratories,CRL,0.027736,195.69,0.75,(0.38%), +449,Healthpeak Properties Inc,PEAK,0.027617,18.15,0.1,(0.58%), +450,Caesars Entertainment Inc,CZR,0.027217,47.52,1.54,(3.36%), +451,Regency Centers Corp,REG,0.027131,59.98,0.85,(1.43%), +452,Keycorp,KEY,0.0269,10.52,0.22,(2.09%), +453,Henry Schein Inc,HSIC,0.026715,73.88,0.62,(0.84%), +454,Globe Life Inc,GL,0.026574,110.04,0.61,(0.56%), +455,Borgwarner Inc,BWA,0.026416,40.72,0.92,(2.31%), +456,F5 Inc,FFIV,0.026087,160.33,2.74,(1.74%), +457,Qorvo Inc,QRVO,0.025849,96.39,1.83,(1.93%), +458,Teleflex Inc,TFX,0.025796,199.42,2.91,(1.48%), +459,Allegion Plc,ALLE,0.025545,104.97,1.68,(1.63%), +460,Westrock Co,WRK,0.025292,35.98,0.23,(0.64%), +461,Eastman Chemical Co,EMN,0.025003,76.99,2.35,(3.15%), +462,Wynn Resorts Ltd,WYNN,0.024938,92.21,0,(-0.00%), +463,Nrg Energy Inc,NRG,0.024681,38.55,-0.03,(-0.08%), +464,Juniper Networks Inc,JNPR,0.024655,27.92,0.42,(1.52%), +465,Pinnacle West Capital,PNW,0.02321,73.45,-0.71,(-0.95%), +466,Hasbro Inc,HAS,0.02308,65.23,0.24,(0.37%), +467,Catalent Inc,CTLT,0.023069,45.85,0.07,(0.15%), +468,American Airlines Group Inc,AAL,0.02296,13,0.39,(3.05%), +469,Fmc Corp,FMC,0.022942,66.03,0.02,(0.03%), +470,Campbell Soup Co,CPB,0.022776,41.15,-0.31,(-0.76%), +471,Smith (a.O.) Corp,AOS,0.022769,66.99,1.54,(2.35%), +472,Boston Properties Inc,BXP,0.02269,59.66,0.79,(1.34%), +473,Huntington Ingalls Industrie,HII,0.022502,204.41,1.22,(0.60%), +474,Fox Corp Class A,FOXA,0.021902,31.47,0.55,(1.76%), +475,Robert Half Inc,RHI,0.021872,73.78,0.64,(0.87%), +476,Assurant Inc,AIZ,0.021618,145.63,-0.13,(-0.09%), +477,Universal Health Services B,UHS,0.021551,127,2.8,(2.25%), +478,Etsy Inc,ETSY,0.021257,63.53,1.64,(2.65%), +479,Marketaxess Holdings Inc,MKTX,0.021132,205.89,4.11,(2.04%), +480,News Corp Class A,NWSA,0.0209,20,0.35,(1.76%), +481,Bio Rad Laboratories A,BIO,0.020548,356.1,3.63,(1.03%), +482,Bath & Body Works Inc,BBWI,0.020412,33.19,1.04,(3.23%), +483,Dentsply Sirona Inc,XRAY,0.020079,33.94,-0.17,(-0.51%), +484,Solaredge Technologies Inc,SEDG,0.020026,132.35,4.34,(3.39%), +485,Whirlpool Corp,WHR,0.019812,131.66,1.03,(0.79%), +486,Franklin Resources Inc,BEN,0.019128,24.55,0.28,(1.14%), +487,Generac Holdings Inc,GNRC,0.018958,110.73,1.84,(1.69%), +488,Norwegian Cruise Line Holdin,NCLH,0.018812,16.96,0.67,(4.08%), +489,Federal Realty Invs Trust,FRT,0.018475,91.45,1.05,(1.16%), +490,Tapestry Inc,TPR,0.01809,28.18,0.23,(0.84%), +491,Invesco Ltd,IVZ,0.017835,14.31,0.22,(1.53%), +492,Paramount Global Class B,PARA,0.017208,12.89,0.11,(0.89%), +493,Vf Corp,VFC,0.015631,16.59,-0.32,(-1.89%), +494,Comerica Inc,CMA,0.014638,41.07,1.12,(2.81%), +495,Davita Inc,DVA,0.014395,95.75,0.01,(0.01%), +496,Zions Bancorp Na,ZION,0.013918,33.96,0.79,(2.39%), +497,Ralph Lauren Corp,RL,0.013127,115.52,0.26,(0.22%), +498,Sealed Air Corp,SEE,0.012794,32.2,0.46,(1.46%), +499,Alaska Air Group Inc,ALK,0.012574,37.04,0.63,(1.73%), +500,Mohawk Industries Inc,MHK,0.011998,85.15,1.23,(1.46%), +501,Organon & Co,OGN,0.011665,16.93,0.34,(2.02%), +502,Dxc Technology Co,DXC,0.011658,20.64,0.29,(1.40%), +503,Fox Corp Class B,FOX,0.010545,29.16,0.53,(1.85%), +504,News Corp Class B,NWS,0.006575,20.75,0.36,(1.74%), diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/BasketConstants.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/BasketConstants.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/BasketConstants.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/BasketConstants.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala similarity index 83% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala index 20ea87f02..02065bd65 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/BasketModule.scala @@ -2,31 +2,26 @@ package org.finos.vuu.core.module.basket import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.time.Clock -import org.finos.vuu.api.{JoinSpec, JoinTableDef, JoinTo, LeftOuterJoin, Link, TableDef, ViewPortDef, VisualLinks} -import org.finos.vuu.core.module.basket.provider.{AlgoProvider, BasketConstituentProvider, BasketProvider, NullProvider, PriceStrategyProvider} -import org.finos.vuu.core.module.basket.service.{BasketService, BasketTradingConstituentJoinService, BasketTradingConstituentService} +import org.finos.vuu.api._ +import org.finos.vuu.core.module.basket.provider._ +import org.finos.vuu.core.module.basket.service.{BasketService, BasketTradingConstituentJoinService, BasketTradingConstituentService, BasketTradingService} import org.finos.vuu.core.module.price.PriceModule -import org.finos.vuu.core.module.simul.SimulationModule import org.finos.vuu.core.module.{DefaultModule, ModuleFactory, TableDefContainer, ViewServerModule} import org.finos.vuu.core.table.Columns object BasketModule extends DefaultModule { - private final val NAME = "BASKET" + final val NAME = "BASKET" final val BasketTable = "basket" final val BasketTradingTable = "basketTrading" final val BasketConstituentTable = "basketConstituent" - final val BasketTradingConstituent = "basketTradingConstituent" + final val BasketTradingConstituentTable = "basketTradingConstituent" final val BasketTradingConstituentJoin = "basketTradingConstituentJoin" def apply()(implicit clock: Clock, lifecycle: LifecycleContainer, tableDefContainer: TableDefContainer): ViewServerModule = { - import org.finos.vuu.core.module.basket.BasketModule.{BasketColumnNames => B} - import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentColumnNames => BC} - import org.finos.vuu.core.module.basket.BasketModule.{BasketTradingColumnNames => BT} - import org.finos.vuu.core.module.basket.BasketModule.{BasketTradingConstituentColumnNames => BTC} - import org.finos.vuu.core.module.basket.BasketModule.{PriceStrategy => PS} + import org.finos.vuu.core.module.basket.BasketModule.{BasketColumnNames => B, BasketConstituentColumnNames => BC, BasketTradingColumnNames => BT, BasketTradingConstituentColumnNames => BTC, PriceStrategy => PS} ModuleFactory.withNamespace(NAME) .addTable( @@ -49,7 +44,7 @@ object BasketModule extends DefaultModule { name = BasketConstituentTable, keyField = BC.RicBasketId, columns = Columns.fromNames(BC.RicBasketId.string(), BC.Ric.string(), BC.BasketId.string(), BC.Weighting.double(), BC.LastTrade.string(), BC.Change.string(), - BC.Volume.string(), BC.Side.string()), // we can join to instruments and other tables to get the rest of the data..... + BC.Volume.string(), BC.Side.string(), BC.Description.string()), // we can join to instruments and other tables to get the rest of the data..... VisualLinks(), joinFields = BC.RicBasketId, BC.Ric ), @@ -59,15 +54,19 @@ object BasketModule extends DefaultModule { TableDef( name = BasketTradingTable, keyField = BT.InstanceId, - columns = Columns.fromNames(BT.InstanceId.string(), BT.BasketId.string(), BT.BasketName.string(), BT.Status.string(), BT.Units.int(), BT.FilledPct.double(), BT.FxRateToUsd.double(), BT.TotalNotional.double(), BT.TotalNotionalUsd.double()), // we can join to instruments and other tables to get the rest of the data..... + columns = Columns.fromNames(BT.InstanceId.string(), BT.BasketId.string(), BT.BasketName.string(), BT.Status.string(), BT.Units.int(), BT.FilledPct.double(), BT.FxRateToUsd.double(), BT.TotalNotional.double(), BT.TotalNotionalUsd.double(), BT.Side.string()), // we can join to instruments and other tables to get the rest of the data..... VisualLinks(), joinFields = BT.BasketId ), - (table, vs) => new NullProvider(table), + (table, vs) => new BasketTradingProvider(table, vs.tableContainer), + (table, _, _, tableContainer) => ViewPortDef( + columns = table.getTableDef.columns, + service = new BasketTradingService(table, tableContainer) + ) ) .addTable( TableDef( - name = BasketTradingConstituent, + name = BasketTradingConstituentTable, keyField = BTC.InstanceIdRic, columns = Columns.fromNames(BTC.Quantity.long(), BTC.Side.string(), BTC.InstanceIdRic.string(), BTC.InstanceId.string(), BTC.Ric.string(), @@ -116,8 +115,8 @@ object BasketModule extends DefaultModule { .addJoinTable(tableDefs => JoinTableDef( name = BasketTradingConstituentJoin, - baseTable = tableDefs.get(NAME, BasketTradingConstituent), - joinColumns = Columns.allFrom(tableDefs.get(NAME, BasketTradingConstituent)) ++ Columns.allFromExcept(tableDefs.get(PriceModule.NAME, "prices"), "ric"), + baseTable = tableDefs.get(NAME, BasketTradingConstituentTable), + joinColumns = Columns.allFrom(tableDefs.get(NAME, BasketTradingConstituentTable)) ++ Columns.allFromExcept(tableDefs.get(PriceModule.NAME, "prices"), "ric"), joins = JoinTo( table = tableDefs.get(PriceModule.NAME, "prices"), @@ -170,9 +169,9 @@ object BasketModule extends DefaultModule { final val Units = "units" final val TotalNotionalUsd = "totalNotionalUsd" final val TotalNotional = "totalNotional" - //BasketTrading Screen final val Status = "status" final val FilledPct = "filledPct" + final val Side = "side" } object BasketTradingConstituentColumnNames { @@ -183,9 +182,6 @@ object BasketModule extends DefaultModule { final val Ric = "ric" final val Description = "description" final val Quantity = "quantity" - final val Last = "last" - final val Bid = "bid" - final val Offer = "offer" final val LimitPrice = "limitPrice" final val PriceStrategyId = "priceStrategyId" final val NotionalUsd = "notionalUsd" @@ -197,4 +193,9 @@ object BasketModule extends DefaultModule { final val Weighting = "weighting" final val PriceSpread = "priceSpread" } + + object Sides{ + final val Buy = "Buy" + final val Sell = "Sell" + } } diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala similarity index 92% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala index ac111cf88..13023bffa 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/csv/CsvStaticLoader.scala @@ -1,14 +1,18 @@ package org.finos.vuu.core.module.basket.csv +import com.typesafe.scalalogging.StrictLogging + import scala.io.Source -object CsvStaticLoader { +object CsvStaticLoader extends StrictLogging { def loadConstituent(basketId: String): Array[Map[String, Any]] = { + val staticDirPath = getClass.getResource("/static").getPath val dir = new java.io.File(staticDirPath) val csvFiles = dir.listFiles.filter(_.isFile) .filter(_.getName.endsWith(basketId.replace(".","").toLowerCase + ".csv")) val csvFile = csvFiles(0) + logger.info("Loading basket static:" + basketId + "(" + csvFile + ")") val bufferedSource = Source.fromFile(csvFile) val csv = for (line <- bufferedSource.getLines) yield line.split(",").map(_.trim) val array = csv.toArray @@ -19,7 +23,7 @@ object CsvStaticLoader { val nameInd = header.indexOf("Name") val lastTradeInd = header.indexOf("Last Trade") val volumeInd = header.indexOf("Volume") - val weightInd = header.indexOf("Weight") + val weightInd = header.indexOf("Weighting") val changeInd = header.indexOf("Change") val list = array.tail.map(e => { val weighting = if(getValueFromIndex(weightInd, e) == null) 0.0D else getValueFromIndex(weightInd, e).toDouble @@ -27,7 +31,7 @@ object CsvStaticLoader { "Symbol" -> getValueFromIndex(symbolInd, e), "Last Trade" -> getValueFromIndex(lastTradeInd, e), "Name" -> getValueFromIndex(nameInd, e), - "Weight" -> weighting, + "Weighting" -> weighting, "Volume" -> getValueFromIndex(volumeInd, e), "Change" -> getValueFromIndex(changeInd, e) ) diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala similarity index 86% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala index 21efb1815..5ae352bc5 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/AlgoProvider.scala @@ -10,11 +10,12 @@ class AlgoProvider(val table: DataTable)(implicit lifecycle: LifecycleContainer, lifecycle(this) private final val Algos = List( - (0, "Sniper"), - (1, "Dark Liquidity"), - (2, "VWAP"), - (3, "POV"), - (4, "Dynamic CLose"), + (-1, "None"), + (1, "Sniper"), + (2, "Dark Liquidity"), + (3, "VWAP"), + (4, "POV"), + (5, "Dynamic CLose"), ) override def doStart(): Unit = { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala similarity index 97% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala index 182cfe867..4b1ec3d06 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketConstituentProvider.scala @@ -31,7 +31,7 @@ class BasketConstituentProvider(val table: DataTable)(implicit lifecycle: Lifecy val lastTrade = row("Last Trade") val change = row("Change") val volume = row("Volume") - val weighting = row("Weight") + val weighting = row("Weighting") val side = BasketConstants.Side.Buy val ricBasketId = symbol + "." + basketId table.processUpdate(ricBasketId, RowWithData(symbol, Map( diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketProvider.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketProvider.scala diff --git a/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketTradingProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketTradingProvider.scala new file mode 100644 index 000000000..7e67b3b48 --- /dev/null +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/BasketTradingProvider.scala @@ -0,0 +1,51 @@ +package org.finos.vuu.core.module.basket.provider + +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.thread.LifeCycleRunner +import org.finos.toolbox.time.Clock +import org.finos.vuu.core.module.basket.BasketModule.BasketTradingColumnNames.{TotalNotional, TotalNotionalUsd} +import org.finos.vuu.core.module.basket.BasketModule.BasketTradingConstituentColumnNames.{InstanceId, Quantity} +import org.finos.vuu.core.module.basket.BasketModule.BasketTradingConstituentJoin +import org.finos.vuu.core.table.{DataTable, RowWithData, TableContainer} +import org.finos.vuu.provider.DefaultProvider + +class BasketTradingProvider(val table: DataTable, val tableContainer: TableContainer)(implicit lifecycle: LifecycleContainer, clock: Clock) extends DefaultProvider{ + private val runner = new LifeCycleRunner("BasketTradingProvider", runOnce, minCycleTime = 2_000) + + lifecycle(this).dependsOn(runner) + + def runOnce(): Unit = { + + val constituent = tableContainer.getTable(BasketTradingConstituentJoin) + + table.primaryKeys.foreach( key => { + + val sumOfNotional = constituent.primaryKeys.filter( conKey =>{ + val row = constituent.pullRow(conKey) + row.get(InstanceId).asInstanceOf[String] == key + }).map(conKey => { + + val quantity = constituent.pullRow(conKey).get(Quantity).asInstanceOf[Long] + val bid =constituent.pullRow(conKey).get("bid").asInstanceOf[Double] + val ask =constituent.pullRow(conKey).get("ask").asInstanceOf[Double] + val last =constituent.pullRow(conKey).get("last").asInstanceOf[Double] + + if(last > 0){ + quantity * last + }else if(bid > 0){ + quantity * bid + } else if (ask > 0) { + quantity * ask + }else{ + 0 + } + + } ).sum + + table.processUpdate(key, RowWithData(key, Map(InstanceId -> key, TotalNotionalUsd -> sumOfNotional.asInstanceOf[Long], TotalNotional -> sumOfNotional.asInstanceOf[Long])), clock.now()) + }) + + } + + override val lifecycleId: String = "BasketTradingProvider#" + hashCode() +} diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/NullProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/NullProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/NullProvider.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/NullProvider.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala similarity index 95% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala index 90f2ece34..0939b2f23 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/provider/PriceStrategyProvider.scala @@ -9,7 +9,7 @@ class PriceStrategyProvider(val table: DataTable)(implicit lifecycle: LifecycleC lifecycle(this) - private final val Strategies = List( + final val Strategies = List( (0, "Peg To Near Touch"), (1, "Far Touch"), (2, "Limit"), diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala similarity index 66% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala index 722ee686d..9be3540bb 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketService.scala @@ -3,12 +3,12 @@ package org.finos.vuu.core.module.basket.service import com.typesafe.scalalogging.StrictLogging import org.finos.toolbox.time.Clock import org.finos.vuu.core.module.basket.BasketModule -import org.finos.vuu.core.module.basket.BasketModule.BasketConstituentTable +import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentTable, PriceStrategy, Sides} import org.finos.vuu.core.module.basket.service.BasketService.counter import org.finos.vuu.core.table.{DataTable, RowData, RowWithData, TableContainer} +import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} import org.finos.vuu.net.{ClientSessionId, RequestContext} -import org.finos.vuu.net.rpc.RpcHandler -import org.finos.vuu.viewport.{NoAction, SelectionViewPortMenuItem, ViewPortAction, ViewPortMenu, ViewPortSelection} +import org.finos.vuu.viewport._ import java.util.concurrent.atomic.AtomicInteger @@ -16,13 +16,15 @@ object BasketService{ val counter = new AtomicInteger(0) } -class BasketService(val table: DataTable, val tableContainer: TableContainer)(implicit clock: Clock) extends RpcHandler with StrictLogging { +trait BasketServiceIF{ + def createBasket(basketKey: String, name: String)(ctx: RequestContext): ViewPortAction +} + +class BasketService(val table: DataTable, val tableContainer: TableContainer)(implicit clock: Clock) extends RpcHandler with BasketServiceIF with StrictLogging { //private val counter = new AtomicInteger(0) - import org.finos.vuu.core.module.basket.BasketModule.{BasketTradingColumnNames => BT} - import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentColumnNames => BC} - import org.finos.vuu.core.module.basket.BasketModule.{BasketTradingConstituentColumnNames => BTC} + import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentColumnNames => BC, BasketTradingColumnNames => BT, BasketTradingConstituentColumnNames => BTC} private def getAndPadCounter(session: ClientSessionId): String = { val counterValue = counter.incrementAndGet() @@ -35,21 +37,27 @@ class BasketService(val table: DataTable, val tableContainer: TableContainer)(im keys.map( key => table.pullRow(key) ).filter(_.get(BC.BasketId).toString == key) } - private def mkTradingConstituentRow(side: String, basketKey: String, instanceKey: String, constituentKey: String, quantity: Long, basketConsRow: RowData): RowWithData = { - RowWithData(constituentKey, Map(BTC.BasketId -> basketKey, BTC.Ric -> basketConsRow.get(BC.Ric), BTC.InstanceId -> instanceKey, + private def mkTradingConstituentRow(side: String, basketKey: String, instanceKey: String, + constituentKey: String, quantity: Long, weighting: Double, basketConsRow: RowData): RowWithData = { + RowWithData(constituentKey, Map(BTC.BasketId -> basketKey, + BTC.Ric -> basketConsRow.get(BC.Ric), + BTC.InstanceId -> instanceKey, BTC.Quantity -> quantity, BTC.InstanceIdRic -> constituentKey, BTC.Description -> basketConsRow.get(BC.Description), - BTC.Side -> side + BTC.Side -> side, + BTC.Weighting -> weighting, + BTC.PriceStrategyId -> 2, + BTC.Algo -> -1, )) } private def mkTradingBasketRow(instanceKey: String, basketKey: String): RowWithData = { - RowWithData(instanceKey, Map(BT.InstanceId -> instanceKey, BT.Status -> "OFF-MARKET", BT.BasketId -> basketKey)) + RowWithData(instanceKey, Map(BT.InstanceId -> instanceKey, BT.Status -> "OFF-MARKET", BT.BasketId -> basketKey, BT.BasketName -> instanceKey, BT.Side -> Sides.Buy, BT.Units -> 1)) } def createBasketFromRpc(basketKey: String, name: String)(ctx: RequestContext): ViewPortAction = { - createBasket(basketKey, name) + createBasket(basketKey, name)(ctx) } def createBasket(selection: ViewPortSelection, session: ClientSessionId): ViewPortAction = { @@ -58,10 +66,14 @@ class BasketService(val table: DataTable, val tableContainer: TableContainer)(im val instanceKey = getAndPadCounter(session) - createBasket(basketKey, instanceKey) + createBasketInternal(basketKey, instanceKey, session) } - private def createBasket(basketKey: String, name: String): ViewPortAction = { + def createBasket(basketKey: String, name: String)(ctx: RequestContext): ViewPortAction = { + createBasketInternal(basketKey, name, ctx.session) + } + + private def createBasketInternal(basketKey: String, name: String, sessionId: ClientSessionId): ViewPortAction = { val constituents = getConstituentsForBasketKey(basketKey) @@ -72,14 +84,14 @@ class BasketService(val table: DataTable, val tableContainer: TableContainer)(im logger.error("Cannot find the Basket Trading table.") } - tableContainer.getTable(BasketModule.BasketTradingConstituent) match { + tableContainer.getTable(BasketModule.BasketTradingConstituentTable) match { case table: DataTable => constituents.foreach( rowData => { val constituentKey = name + "." + rowData.get(BTC.Ric) val weighting = rowData.get(BTC.Weighting).asInstanceOf[Double] val quantity = (weighting * 100).asInstanceOf[Long] val side = rowData.get(BTC.Side).toString - table.processUpdate(constituentKey, mkTradingConstituentRow(side, basketKey, name, constituentKey, quantity, rowData), clock.now()) + table.processUpdate(constituentKey, mkTradingConstituentRow(side, basketKey, name, constituentKey, quantity, weighting, rowData), clock.now()) }) case null => logger.error("Cannot find the Basket Trading Constituent.") @@ -91,4 +103,5 @@ class BasketService(val table: DataTable, val tableContainer: TableContainer)(im override def menuItems(): ViewPortMenu = ViewPortMenu( new SelectionViewPortMenuItem("Create New", "", (sel, sess) => this.createBasket(sel, sess), "CREATE_NEW_BASKET"), ) + } diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala similarity index 87% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala index 5681d8ba7..6a6685641 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentJoinService.scala @@ -76,4 +76,17 @@ class BasketTradingConstituentJoinService(val table: DataTable, val tableContain override def onFormClose(): ViewPortFormCloseAction = ViewPortFormCloseAction("", this.onFormClose) + def setSell(selection: ViewPortSelection, session: ClientSessionId): ViewPortAction = { + ViewPortEditSuccess() + } + + def setBuy(selection: ViewPortSelection, session: ClientSessionId): ViewPortAction = { + ViewPortEditSuccess() + } + + override def menuItems(): ViewPortMenu = ViewPortMenu("Direction", + new SelectionViewPortMenuItem("Set Sell", "", this.setSell, "SET_SELECTION_SELL"), + new SelectionViewPortMenuItem("Set Buy", "", this.setBuy, "SET_SELECTION_Buy") + ) + } diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala similarity index 86% rename from vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala rename to example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala index faa21347a..2975b4299 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingConstituentService.scala @@ -69,4 +69,16 @@ class BasketTradingConstituentService(val table: DataTable, val tableContainer: override def onFormClose(): ViewPortFormCloseAction = ViewPortFormCloseAction("", this.onFormClose) + def setSell(selection: ViewPortSelection, session: ClientSessionId): ViewPortAction = { + ViewPortEditSuccess() + } + + def setBuy(selection: ViewPortSelection, session: ClientSessionId): ViewPortAction = { + ViewPortEditSuccess() + } + + override def menuItems(): ViewPortMenu = ViewPortMenu("Direction", + new SelectionViewPortMenuItem("Set Sell", "", this.setSell, "SET_SELECTION_SELL"), + new SelectionViewPortMenuItem("Set Buy", "", this.setBuy, "SET_SELECTION_Buy") + ) } diff --git a/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingService.scala b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingService.scala new file mode 100644 index 000000000..5767db434 --- /dev/null +++ b/example/basket/src/main/scala/org/finos/vuu/core/module/basket/service/BasketTradingService.scala @@ -0,0 +1,63 @@ +package org.finos.vuu.core.module.basket.service + +import com.typesafe.scalalogging.StrictLogging +import org.finos.toolbox.time.Clock +import org.finos.vuu.core.module.basket.BasketModule.{BasketTradingConstituentTable, Sides} +import org.finos.vuu.core.table.{DataTable, RowWithData, TableContainer} +import org.finos.vuu.net.ClientSessionId +import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} +import org.finos.vuu.viewport.{ViewPort, ViewPortAddRowAction, ViewPortDeleteCellAction, ViewPortDeleteRowAction, ViewPortEditAction, ViewPortEditCellAction, ViewPortEditRowAction, ViewPortEditSuccess, ViewPortFormCloseAction, ViewPortFormSubmitAction} + +trait BasketTradingServiceIF extends EditRpcHandler{ + +} + +class BasketTradingService(val table: DataTable, val tableContainer: TableContainer)(implicit clock: Clock) extends RpcHandler with BasketTradingServiceIF with StrictLogging { + + import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentColumnNames => BC, BasketTradingColumnNames => BT, BasketTradingConstituentColumnNames => BTC} + + private def onEditCell(key: String, columnName: String, data: Any, vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + logger.info("Changing cell value for key:" + key + "(" + columnName + ":" + data + ")") + table.processUpdate(key, RowWithData(key, Map(BT.InstanceId -> key, columnName -> data)), clock.now()) + + columnName match { + case BT.Units => + val constituentTable = tableContainer.getTable(BasketTradingConstituentTable) + val constituents = constituentTable.primaryKeys.map(key => constituentTable.pullRow(key)).filter(_.get(BTC.InstanceId) == key) + constituents.foreach( row => { + val unitsAsInt = data.asInstanceOf[Int] + val weighting = row.get(BTC.Weighting) + val quantity = (weighting.asInstanceOf[Double] * unitsAsInt).toLong + constituentTable.processUpdate(row.key(), RowWithData(row.key(), Map(BTC.InstanceIdRic -> row.key(), BTC.Quantity -> quantity)), clock.now()) + }) + case BT.Side => + val constituentTable = tableContainer.getTable(BasketTradingConstituentTable) + val constituents = constituentTable.primaryKeys.map(key => constituentTable.pullRow(key)).filter(_.get(BTC.InstanceId) == key) + val side = data.asInstanceOf[String] + constituents.foreach(row => { + val newSide = row.get(BTC.Side) match { + case Sides.Buy => Sides.Sell + case _ => Sides.Buy + } + constituentTable.processUpdate(row.key(), RowWithData(row.key(), Map(BTC.InstanceIdRic -> row.key(), BTC.Side -> newSide)), clock.now()) + }) + + case _ => + } + + ViewPortEditSuccess() + } + override def deleteRowAction(): ViewPortDeleteRowAction = ??? + + override def deleteCellAction(): ViewPortDeleteCellAction = ??? + + override def addRowAction(): ViewPortAddRowAction = ??? + + override def editCellAction(): ViewPortEditCellAction = ViewPortEditCellAction("", onEditCell) + override def editRowAction(): ViewPortEditRowAction = ??? + + override def onFormSubmit(): ViewPortFormSubmitAction = ??? + + override def onFormClose(): ViewPortFormCloseAction = ??? + +} diff --git a/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketCreateTest.scala b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketCreateTest.scala new file mode 100644 index 000000000..43bde891c --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketCreateTest.scala @@ -0,0 +1,75 @@ +package org.finos.vuu.core.module.basket + +import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.time.{Clock, TestFriendlyClock} +import org.finos.vuu.api.ViewPortDef +import org.finos.vuu.core.module.TableDefContainer +import org.finos.vuu.core.module.basket.service.{BasketServiceIF, BasketTradingServiceIF} +import org.finos.vuu.core.module.price.PriceModule +import org.finos.vuu.core.table.TableTestHelper.combineQs +import org.finos.vuu.test.VuuServerTestCase +import org.finos.vuu.util.table.TableAsserts.assertVpEq +import org.scalatest.prop.Tables.Table + +class BasketCreateTest extends VuuServerTestCase { + + Feature("Basket Service Test Case") { + + Scenario("Check the creation of the baskets and constituents") { + + implicit val clock: Clock = new TestFriendlyClock(10001L) + implicit val lifecycle: LifecycleContainer = new LifecycleContainer() + implicit val tableDefContainer: TableDefContainer = new TableDefContainer(Map()) + implicit val metricsProvider: MetricsProvider = new MetricsProviderImpl + + import BasketModule.{BasketTradingColumnNames => BT, _} + + withVuuServer(PriceModule(), BasketModule()) { + vuuServer => + + vuuServer.login("testUser", "testToken") + + vuuServer.overrideViewPortDef("prices", (table, _, _, _) => ViewPortDef(table.getTableDef.columns, null)) + + val pricesProvider = vuuServer.getProvider(PriceModule.NAME, "prices") + + pricesProvider.tick("VOD.L", Map("ric" -> "VOD.L", "phase" -> "C")) + + val viewport = vuuServer.createViewPort(PriceModule.NAME, "prices") + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewport)) { + Table( + ("ric", "bid", "ask", "bidSize", "askSize", "last", "open", "close", "phase", "scenario"), + ("VOD.L", null, null, null, null, null, null, null, "C", null) + ) + } + + val viewportBasket = vuuServer.createViewPort(BasketModule.NAME, BasketTable) + + val basketService = vuuServer.getViewPortRpcServiceProxy[BasketServiceIF](viewportBasket) + + val action = basketService.createBasket(".FTSE", "chris-001")(vuuServer.requestContext) + + val viewportBasketTrading = vuuServer.createViewPort(BasketModule.NAME, BasketTradingTable) + + val basketTradingService = vuuServer.getViewPortRpcServiceProxy[BasketTradingServiceIF](viewportBasketTrading) + + //CJS: I don't like this forced cast, need to look at that a bit + basketTradingService.editCellAction().func("chris-001", BT.Units, 100.asInstanceOf[Object], viewportBasketTrading, vuuServer.session) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewportBasketTrading)) { + Table( + ("basketId", "instanceId", "basketName", "units", "status", "filledPct", "totalNotionalUsd", "totalNotional", "fxRateToUsd", "side"), + (".FTSE", "chris-001", "chris-001", 100, "OFF-MARKET", null, null, null, null, "Buy") + ) + } + } + } + } + +} diff --git a/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketMutateOffMarketTest.scala b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketMutateOffMarketTest.scala new file mode 100644 index 000000000..93d8e73cc --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketMutateOffMarketTest.scala @@ -0,0 +1,143 @@ +package org.finos.vuu.core.module.basket + +import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.time.{Clock, TestFriendlyClock} +import org.finos.vuu.api.ViewPortDef +import org.finos.vuu.core.module.TableDefContainer +import org.finos.vuu.core.module.basket.service.{BasketServiceIF, BasketTradingServiceIF} +import org.finos.vuu.core.module.price.PriceModule +import org.finos.vuu.test.VuuServerTestCase +import org.finos.vuu.util.table.TableAsserts.assertVpEq +import org.scalatest.prop.Tables.Table + +class BasketMutateOffMarketTest extends VuuServerTestCase { + + import BasketTestCaseHelper._ + + Feature("Basket Service Test Case") { + + Scenario("Check the creation of the baskets and constituents") { + + implicit val clock: Clock = new TestFriendlyClock(10001L) + implicit val lifecycle: LifecycleContainer = new LifecycleContainer() + implicit val tableDefContainer: TableDefContainer = new TableDefContainer(Map()) + implicit val metricsProvider: MetricsProvider = new MetricsProviderImpl + + import BasketModule._ + + withVuuServer(PriceModule(), BasketModule()) { + vuuServer => + + vuuServer.login("testUser", "testToken") + + vuuServer.overrideViewPortDef("prices", (table, _, _, _) => ViewPortDef(table.getTableDef.columns, null)) + + val pricesProvider = vuuServer.getProvider(PriceModule.NAME, "prices") + val basketProvider = vuuServer.getProvider(BasketModule.NAME, BasketTable) + val constituentProvider = vuuServer.getProvider(BasketModule.NAME, BasketConstituentTable) + + tickPrices(pricesProvider) + tickBasketDef(basketProvider) + tickConstituentsDef(constituentProvider) + + val vpBasket = vuuServer.createViewPort(BasketModule.NAME, BasketTable) + + vuuServer.runOnce() + + When("we have 2 basket definitions") + assertVpEq(combineQsForVp(vpBasket)) { + Table( + ("id", "name", "notionalValue", "notionalValueUsd"), + (".FTSE", ".FTSE 100", 1000001, 1500001), + (".NASDAQ", ".NASDAQ", 3000001, 3500001) + ) + } + + val vpConstituent = vuuServer.createViewPort(BasketModule.NAME, BasketConstituentTable) + + vuuServer.runOnce() + + And(".FTSE is composed of 3 constituents") + assertVpEq(combineQsForVp(vpConstituent)) { + Table( + ("ricBasketId", "ric", "basketId", "weighting", "lastTrade", "change", "volume", "description", "side"), + ("BP.L.FTSE", "BP.L", ".FTSE", 0.1, null, null, null, "Beyond Petroleum", "Buy"), + ("BT.L.FTSE", "BT.L", ".FTSE", 0.1, null, null, null, "British Telecom", "Sell"), + ("VOD.L.FTSE", "VOD.L", ".FTSE", 0.1, null, null, null, "Vodafone", "Buy") + ) + } + + Then("Get the Basket RPC Service and call create basket") + val basketService = vuuServer.getViewPortRpcServiceProxy[BasketServiceIF](vpBasket) + basketService.createBasket(".FTSE", "chris-001")(vuuServer.requestContext) + + val vpBasketTrading = vuuServer.createViewPort(BasketModule.NAME, BasketTradingTable) + + vuuServer.runOnce() + + And("Check the basket trading record has been created") + //BT.InstanceId.string(), BT.BasketId.string(), BT.BasketName.string(), BT.Status.string(), BT.Units.int(), BT.FilledPct.double(), BT.FxRateToUsd.double(), BT.TotalNotional.double(), BT.TotalNotionalUsd.double(), BT.Side.string() + assertVpEq(combineQsForVp(vpBasketTrading)) { + Table( + ("instanceId", "basketId", "basketName", "status", "units", "filledPct", "fxRateToUsd", "totalNotional", "totalNotionalUsd", "side"), + ("chris-001", ".FTSE", "chris-001", "OFF-MARKET", 1, null, null, null, null, "Buy") + ) + } + + val vpBasketTradingCons = vuuServer.createViewPort(BasketModule.NAME, BasketTradingConstituentTable) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(vpBasketTradingCons)) { + Table( + ("quantity", "side", "instanceId", "instanceIdRic", "basketId", "ric", "description", "notionalUsd", "notionalLocal", "venue", "algo", "algoParams", "pctFilled", "weighting", "priceSpread", "limitPrice", "priceStrategyId"), + (10L, "Buy", "chris-001", "chris-001.BP.L", ".FTSE", "BP.L", "Beyond Petroleum", null, null, null, -1, null, null, 0.1, null, null, 2), + (10L, "Sell", "chris-001", "chris-001.BT.L", ".FTSE", "BT.L", "British Telecom", null, null, null, -1, null, null, 0.1, null, null, 2), + (10L, "Buy", "chris-001", "chris-001.VOD.L", ".FTSE", "VOD.L", "Vodafone", null, null, null, -1, null, null, 0.1, null, null, 2) + ) + } + + val basketTradingService = vuuServer.getViewPortRpcServiceProxy[BasketTradingServiceIF](vpBasketTrading) + + When("we edit the side of the parent basket") + basketTradingService.editCellAction().func("chris-001", "side", "Sell", vpBasketTrading, vuuServer.session) + + Then("get all the updates that have occurred for all view ports from the outbound queue") + val updates = combineQs(vpBasketTrading) + + And("assert the basket trading table has flipped side....") + assertVpEq(filterByVp(vpBasketTrading, updates)) { + Table( + ("instanceId", "basketId", "basketName", "status", "units", "filledPct", "fxRateToUsd", "totalNotional", "totalNotionalUsd", "side"), + ("chris-001", ".FTSE", "chris-001", "OFF-MARKET", 1, null, null, null, null, "Sell") + ) + } + + //vuuServer.runOnce() + And("assert the basket trading constituent table has flipped sides also") + assertVpEq(filterByVp(vpBasketTradingCons,updates)) { + Table( + ("quantity", "side", "instanceId", "instanceIdRic", "basketId", "ric", "description", "notionalUsd", "notionalLocal", "venue", "algo", "algoParams", "pctFilled", "weighting", "priceSpread", "limitPrice", "priceStrategyId"), + (10L, "Sell", "chris-001", "chris-001.BP.L", ".FTSE", "BP.L", "Beyond Petroleum", null, null, null, -1, null, null, 0.1, null, null, 2), + (10L, "Buy", "chris-001", "chris-001.BT.L", ".FTSE", "BT.L", "British Telecom", null, null, null, -1, null, null, 0.1, null, null, 2), + (10L, "Sell", "chris-001", "chris-001.VOD.L", ".FTSE", "VOD.L", "Vodafone", null, null, null, -1, null, null, 0.1, null, null, 2) + ) + } + + When("we edit the units of the parent basket") + basketTradingService.editCellAction().func("chris-001", "units", 1000L.asInstanceOf[Object], vpBasketTrading, vuuServer.session) + + And("assert the basket trading constituent table has increased the units") + assertVpEq(filterByVp(vpBasketTradingCons, combineQs(vpBasketTrading))) { + Table( + ("quantity", "side", "instanceId", "instanceIdRic", "basketId", "ric", "description", "notionalUsd", "notionalLocal", "venue", "algo", "algoParams", "pctFilled", "weighting", "priceSpread", "limitPrice", "priceStrategyId"), + (100L, "Sell", "chris-001", "chris-001.BP.L", ".FTSE", "BP.L", "Beyond Petroleum", null, null, null, -1, null, null, 0.1, null, null, 2), + (100L, "Buy", "chris-001", "chris-001.BT.L", ".FTSE", "BT.L", "British Telecom", null, null, null, -1, null, null, 0.1, null, null, 2), + (100L, "Sell", "chris-001", "chris-001.VOD.L", ".FTSE", "VOD.L", "Vodafone", null, null, null, -1, null, null, 0.1, null, null, 2) + ) + } + } + } + } +} \ No newline at end of file diff --git a/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketTestCaseHelper.scala b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketTestCaseHelper.scala new file mode 100644 index 000000000..540cb1d2d --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/BasketTestCaseHelper.scala @@ -0,0 +1,27 @@ +package org.finos.vuu.core.module.basket + +import org.finos.vuu.core.module.basket.BasketModule.{BasketColumnNames => B, BasketConstituentColumnNames => BC} +import org.finos.vuu.provider.MockProvider + +object BasketTestCaseHelper { + def tickPrices(provider: MockProvider): Unit = { + provider.tick("VOD.L", Map("ric" -> "VOD.L", "phase" -> "C", "bid" -> 100, "ask" -> 101, "last" -> 101.5)) + provider.tick("BT.L", Map("ric" -> "BT.L", "phase" -> "C", "bid" -> 200, "ask" -> 201, "last" -> 201.5)) + provider.tick("BP.L", Map("ric" -> "BP.L", "phase" -> "C", "bid" -> 300, "ask" -> 301, "last" -> 301.5)) + provider.tick("AAPL", Map("ric" -> "AAPL", "phase" -> "C", "bid" -> 1000, "ask" -> 1001, "last" -> 1001.5)) + provider.tick("MSFT", Map("ric" -> "MSFT", "phase" -> "C", "bid" -> 1100, "ask" -> 1001, "last" -> 1001.5)) + } + def tickBasketDef(provider: MockProvider): Unit = { + provider.tick(".FTSE", Map(B.Id -> ".FTSE", B.Name -> ".FTSE 100", B.NotionalValue -> 1000001, B.NotionalValueUsd -> 1500001)) + provider.tick(".NASDAQ", Map(B.Id -> ".NASDAQ", B.Name -> ".NASDAQ", B.NotionalValue -> 3000001, B.NotionalValueUsd -> 3500001)) + } + + def tickConstituentsDef(provider: MockProvider): Unit = { + //symbol + "." + basketId + //Columns.fromNames(BC.RicBasketId.string(), BC.Ric.string(), BC.BasketId.string(), BC.Weighting.double(), BC.LastTrade.string(), BC.Change.string(), + // BC.Volume.string(), BC.Side.string()) + provider.tick("VOD.L.FTSE", Map(BC.RicBasketId -> "VOD.L.FTSE", BC.Ric -> "VOD.L", BC.BasketId -> ".FTSE", BC.Weighting -> 0.1, BC.Side -> "Buy", BC.Description -> "Vodafone")) + provider.tick("BT.L.FTSE", Map(BC.RicBasketId -> "BT.L.FTSE", BC.Ric -> "BT.L", BC.BasketId -> ".FTSE", BC.Weighting -> 0.1, BC.Side -> "Sell", BC.Description -> "British Telecom")) + provider.tick("BP.L.FTSE", Map(BC.RicBasketId -> "BP.L.FTSE", BC.Ric -> "BP.L", BC.BasketId -> ".FTSE", BC.Weighting -> 0.1, BC.Side -> "Buy", BC.Description -> "Beyond Petroleum")) + } +} diff --git a/example/basket/src/test/scala/org/finos/vuu/core/module/basket/TestService.scala b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/TestService.scala new file mode 100644 index 000000000..a2f66c49e --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/core/module/basket/TestService.scala @@ -0,0 +1,25 @@ +package org.finos.vuu.core.module.basket + +import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} +import org.finos.vuu.viewport.{ViewPortAction, ViewPortAddRowAction, ViewPortDeleteCellAction, ViewPortDeleteRowAction, ViewPortEditCellAction, ViewPortEditRowAction, ViewPortEditSuccess, ViewPortFormCloseAction, ViewPortFormSubmitAction} + +class TestService extends RpcHandler with EditRpcHandler { + def sendBasketToMarket(): ViewPortAction = { + println("test") + ViewPortEditSuccess() + } + + override def deleteRowAction(): ViewPortDeleteRowAction = ??? + + override def deleteCellAction(): ViewPortDeleteCellAction = ??? + + override def addRowAction(): ViewPortAddRowAction = ??? + + override def editCellAction(): ViewPortEditCellAction = ??? + + override def editRowAction(): ViewPortEditRowAction = ??? + + override def onFormSubmit(): ViewPortFormSubmitAction = ??? + + override def onFormClose(): ViewPortFormCloseAction = ??? +} diff --git a/example/basket/src/test/scala/org/finos/vuu/provider/BasketConstituentProviderTest.scala b/example/basket/src/test/scala/org/finos/vuu/provider/BasketConstituentProviderTest.scala new file mode 100644 index 000000000..f8a959b93 --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/provider/BasketConstituentProviderTest.scala @@ -0,0 +1,102 @@ +//package org.finos.vuu.provider +// +//import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +//import org.finos.toolbox.lifecycle.LifecycleContainer +//import org.finos.toolbox.time.TestFriendlyClock +//import org.finos.vuu.api.{TableDef, VisualLinks} +//import org.finos.vuu.core.module.FieldDefString +//import org.finos.vuu.core.module.basket.BasketModule.{BasketConstituentColumnNames => BC} +//import org.finos.vuu.core.module.basket.provider.BasketConstituentProvider +//import org.finos.vuu.core.table.{Column, Columns, SimpleDataTable, ViewPortColumnCreator} +//import org.scalatest.BeforeAndAfter +//import org.scalatest.featurespec.AnyFeatureSpec +//import org.scalatest.matchers.should.Matchers +// +//class BasketConstituentProviderTest extends AnyFeatureSpec with Matchers with BeforeAndAfter { +// final val TEST_TIME = 1450770869442L +// val joinProvider = new TestFriendlyJoinTableProvider +// implicit val timeProvider: TestFriendlyClock = new TestFriendlyClock(TEST_TIME) +// implicit val metrics: MetricsProvider = new MetricsProviderImpl +// implicit val lifecycleContainer: LifecycleContainer = new LifecycleContainer +// +// val tableDef = TableDef( +// name = "basketConstituent", +// keyField = BC.RicBasketId, +// columns = Columns.fromNames(new FieldDefString(BC.RicBasketId).string(), +// new FieldDefString(BC.Ric).string(), +// new FieldDefString(BC.BasketId).string(), +// new FieldDefString(BC.Weighting).double(), +// new FieldDefString(BC.LastTrade).string(), +// new FieldDefString(BC.Change).string(), +// new FieldDefString(BC.Volume).string()), // we can join to instruments and other tables to get the rest of the data..... +// VisualLinks(), +// joinFields = BC.RicBasketId +// ) +// val table = new SimpleDataTable(tableDef, joinProvider) +// val provider = new BasketConstituentProvider(table) +// val columns: Array[Column] = provider.table.getTableDef.columns +// val headers: Array[String] = columns.map(_.name) +// +// before { +// provider.runOnce +// } +// +// ignore("Able to load basket constituents from .FTSE100 and show on basket constituent table") { +// +// Scenario("display ric") { +// assert(getDataForBasket(".FTSE100")(0)(headers.indexOf(BC.Ric)) == "AAL.L") +// } +// +// Scenario("display basket id") { +// assert(getDataForBasket(".FTSE100")(0)(headers.indexOf(BC.BasketId)) == ".FTSE100") +// } +// +// Scenario("display change") { +// assert(getDataForBasket(".FTSE100")(0)(headers.indexOf(BC.Change)) == "�5.35�(1.24%)") +// } +// +// // TODO emily - volume with , is not parsed correctly +//// Scenario("display volume") { +//// assert(getDataForBasket(".FTSE100")(0)(headers.indexOf(BC.Volume)) == "5,799,089") +//// } +// +// Scenario("display weighting") { +// assert(getDataForBasket(".FTSE100")(0)(headers.indexOf(BC.Weighting)) == null) +// } +// } +// +// ignore("Able to load basket constituents from .NASDAQ100 and show on basket constituent table") { +// +//// Scenario("display ric") { +//// val array = getDataForBasket(".NASDAQ100") +//// assert(array(0)(headers.indexOf(BC.Ric)) == "AAPL") +//// } +// +// Scenario("display basket id") { +// assert(getDataForBasket(".NASDAQ100")(0)(headers.indexOf(BC.BasketId)) == ".NASDAQ100") +// } +// +// Scenario("display change") { +// assert(getDataForBasket(".NASDAQ100")(0)(headers.indexOf(BC.Change)) == null) +// } +// +// Scenario("display volume") { +// assert(getDataForBasket(".NASDAQ100")(0)(headers.indexOf(BC.Volume)) == null) +// } +// +//// Scenario("display weighting") { +//// assert(getDataForBasket(".NASDAQ100")(0)(headers.indexOf(BC.Weighting)) == "11.007") +//// } +// } +// +// +// private def getData = { +// val keys = provider.table.primaryKeys +// val data = keys.toArray.map(key => provider.table.pullRowAsArray(key, ViewPortColumnCreator.create(provider.table, columns.map(_.name).toList))) +// data +// } +// private def getDataForBasket(basketId:String) = { +// val data = getData +// data.filter(e => e(headers.indexOf(BC.BasketId))==basketId) +// } +//} diff --git a/example/basket/src/test/scala/org/finos/vuu/provider/BasketProviderTest.scala b/example/basket/src/test/scala/org/finos/vuu/provider/BasketProviderTest.scala new file mode 100644 index 000000000..04602a52d --- /dev/null +++ b/example/basket/src/test/scala/org/finos/vuu/provider/BasketProviderTest.scala @@ -0,0 +1,55 @@ +//package org.finos.vuu.provider +// +//import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +//import org.finos.toolbox.lifecycle.LifecycleContainer +//import org.finos.toolbox.time.TestFriendlyClock +//import org.finos.vuu.api.{TableDef, VisualLinks} +//import org.finos.vuu.core.module.FieldDefString +//import org.finos.vuu.core.module.basket.BasketModule.{BasketColumnNames => B} +//import org.finos.vuu.core.module.basket.provider.BasketProvider +//import org.finos.vuu.core.table.{Column, Columns, SimpleDataTable, ViewPortColumnCreator} +//import org.scalatest.BeforeAndAfter +//import org.scalatest.featurespec.AnyFeatureSpec +//import org.scalatest.matchers.should.Matchers +// +//class BasketProviderTest extends AnyFeatureSpec with Matchers with BeforeAndAfter { +// final val TEST_TIME = 1450770869442L +// val joinProvider = new TestFriendlyJoinTableProvider +// implicit val timeProvider: TestFriendlyClock = new TestFriendlyClock(TEST_TIME) +// implicit val metrics: MetricsProvider = new MetricsProviderImpl +// implicit val lifecycleContainer: LifecycleContainer = new LifecycleContainer +// +// val tableDef = TableDef( +// name = "basket", +// keyField = B.Id, +// columns = Columns.fromNames( +// new FieldDefString(B.Id).string(), +// new FieldDefString(B.Name).string(), +// new FieldDefString(B.NotionalValue).double(), +// new FieldDefString(B.NotionalValueUsd).double()), +// VisualLinks(), +// joinFields = B.Id +// ) +// val table = new SimpleDataTable(tableDef, joinProvider) +// val provider = new BasketProvider(table) +// val columns: Array[Column] = provider.table.getTableDef.columns +// val headers: Array[String] = columns.map(_.name) +// +// before { +// provider.runOnce() +// } +// +// Feature("Able to load baskets") { +// +// Scenario("get list of baskets") { +// val ids = getData.map(e => e(headers.indexOf(B.Id))) +//// assert(ids.sameElements(Array(".NASDAQ100", ".FTSE100", ".SP500", ".HSI"))) +// } +// } +// +// private def getData = { +// val keys = provider.table.primaryKeys +// val data = keys.toArray.map(key => provider.table.pullRowAsArray(key, ViewPortColumnCreator.create(provider.table, columns.map(_.name).toList))) +// data +// } +//} diff --git a/example/editable/pom.xml b/example/editable/pom.xml new file mode 100644 index 000000000..e034a6725 --- /dev/null +++ b/example/editable/pom.xml @@ -0,0 +1,262 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + + editable + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + tests + test-jar + test + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala similarity index 93% rename from vuu/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala rename to example/editable/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala index e7efa02b7..0ce63035b 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala +++ b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/EditableModule.scala @@ -1,12 +1,10 @@ package org.finos.vuu.core.module.editable +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.time.Clock import org.finos.vuu.api.{SessionTableDef, TableDef, ViewPortDef, VisualLinks} import org.finos.vuu.core.module.{DefaultModule, ModuleFactory, TableDefContainer, ViewServerModule} import org.finos.vuu.core.table.Columns -import org.finos.vuu.provider.RpcProvider -import org.finos.toolbox.lifecycle.LifecycleContainer -import org.finos.toolbox.time.Clock -import org.finos.vuu.core.module.vui.VuiStateStoreProvider object EditableModule extends DefaultModule { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala similarity index 89% rename from vuu/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala rename to example/editable/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala index 22b4a1e42..381b747fa 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala +++ b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/FixSequenceRpcService.scala @@ -4,7 +4,7 @@ import org.finos.toolbox.time.Clock import org.finos.vuu.core.table.RowWithData import org.finos.vuu.net.ClientSessionId import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} -import org.finos.vuu.viewport.{CloseDialogViewPortAction, ViewPort, ViewPortAction, ViewPortAddRowAction, ViewPortDeleteCellAction, ViewPortDeleteRowAction, ViewPortEditAction, ViewPortEditCellAction, ViewPortEditFailure, ViewPortEditRowAction, ViewPortEditSuccess, ViewPortFormCloseAction, ViewPortFormSubmitAction} +import org.finos.vuu.viewport._ class FixSequenceRpcService(implicit clock: Clock) extends RpcHandler with EditRpcHandler{ diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala similarity index 93% rename from vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala rename to example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala index 720d504de..629fb0a11 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala +++ b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessProvider.scala @@ -1,7 +1,7 @@ package org.finos.vuu.core.module.editable import org.finos.toolbox.lifecycle.LifecycleContainer -import org.finos.toolbox.thread.{LifeCycleRunner, RunOnceLifeCycleRunner} +import org.finos.toolbox.thread.RunOnceLifeCycleRunner import org.finos.toolbox.time.Clock import org.finos.vuu.core.table.{DataTable, RowWithData} import org.finos.vuu.provider.Provider diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala similarity index 70% rename from vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala rename to example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala index d44dcfb68..97701e3da 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala +++ b/example/editable/src/main/scala/org/finos/vuu/core/module/editable/ProcessRpcService.scala @@ -1,10 +1,10 @@ package org.finos.vuu.core.module.editable import org.finos.toolbox.time.Clock -import org.finos.vuu.core.table.{DataTable, RowWithData, TableContainer} +import org.finos.vuu.core.table.{RowWithData, TableContainer} import org.finos.vuu.net.ClientSessionId -import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} -import org.finos.vuu.viewport.{OpenDialogViewPortAction, RenderComponent, SelectionViewPortMenuItem, ViewPortAction, ViewPortAddRowAction, ViewPortDeleteCellAction, ViewPortDeleteRowAction, ViewPortEditCellAction, ViewPortEditRowAction, ViewPortFormCloseAction, ViewPortFormSubmitAction, ViewPortMenu, ViewPortSelection, ViewPortTable} +import org.finos.vuu.net.rpc.RpcHandler +import org.finos.vuu.viewport._ class ProcessRpcService(val tableContainer: TableContainer)(implicit clock: Clock) extends RpcHandler{ diff --git a/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTest.scala b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTest.scala new file mode 100644 index 000000000..2ae309bf3 --- /dev/null +++ b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTest.scala @@ -0,0 +1,78 @@ +package org.finos.vuu.core.module.editable + +import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.time.{Clock, TestFriendlyClock} +import org.finos.vuu.core.module.TableDefContainer +import org.finos.vuu.core.table.TableTestHelper.combineQs +import org.finos.vuu.test.VuuServerTestCase +import org.finos.vuu.util.table.TableAsserts.assertVpEq +import org.scalatest.prop.Tables.Table + +class EditableTest extends VuuServerTestCase { + + Feature("Editable Test Case") { + + Scenario("Check the editable functionality") { + + implicit val clock: Clock = new TestFriendlyClock(10001L) + implicit val lifecycle: LifecycleContainer = new LifecycleContainer() + implicit val tableDefContainer: TableDefContainer = new TableDefContainer(Map()) + implicit val metricsProvider: MetricsProvider = new MetricsProviderImpl + + withVuuServer(EditableTestModule()) { + vuuServer => + + vuuServer.login("testUser", "testToken") + + val viewport = vuuServer.createViewPort(EditableTestModule.NAME, "editTestTable") + + val service = vuuServer.getViewPortRpcServiceProxy[TestEditableServiceIF](viewport) + + service.addRowAction().func("key1", Map("rowId" -> "key1", "A" -> "TEST", "B" -> 1001D, "C" -> 500, "D" -> true), viewport, vuuServer.session) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewport)) { + Table( + ("rowId", "A", "B", "C", "D"), + ("key1", "TEST", 1001.0, 500, true) + ) + } + + service.editCellAction().func("key1", "B", 200D.asInstanceOf[Object], viewport, vuuServer.session) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewport)) { + Table( + ("rowId", "A", "B", "C", "D"), + ("key1", "TEST", 200.0, 500, true) + ) + } + + service.addRowAction().func("key1", Map("rowId" -> "key2", "A" -> "TEST2", "B" -> 1001D, "C" -> 500, "D" -> true), viewport, vuuServer.session) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewport)) { + Table( + ("rowId", "A", "B", "C", "D"), + ("key2", "TEST2", 1001.0, 500, true) + ) + } + + service.deleteRowAction().func("key1", viewport, vuuServer.session) + + vuuServer.runOnce() + + assertVpEq(combineQsForVp(viewport)) { + Table( + ("rowId", "A", "B", "C", "D") + ) + } + + } + } + } +} diff --git a/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTestModule.scala b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTestModule.scala new file mode 100644 index 000000000..3b591cab9 --- /dev/null +++ b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/EditableTestModule.scala @@ -0,0 +1,89 @@ +package org.finos.vuu.core.module.editable + +import com.typesafe.scalalogging.StrictLogging +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.time.Clock +import org.finos.vuu.api.{TableDef, ViewPortDef, VisualLinks} +import org.finos.vuu.core.module.{ModuleFactory, TableDefContainer, ViewServerModule} +import org.finos.vuu.core.module.ModuleFactory.stringToString +import org.finos.vuu.core.table.{Columns, DataTable, RowWithData, TableContainer} +import org.finos.vuu.net.ClientSessionId +import org.finos.vuu.net.rpc.{EditRpcHandler, RpcHandler} +import org.finos.vuu.viewport.{ViewPort, ViewPortAddRowAction, ViewPortDeleteCellAction, ViewPortDeleteRowAction, ViewPortEditAction, ViewPortEditCellAction, ViewPortEditRowAction, ViewPortEditSuccess, ViewPortFormCloseAction, ViewPortFormSubmitAction} + +trait TestEditableServiceIF extends EditRpcHandler { + +} + +class TestEditableService(val table: DataTable, val tableContainer: TableContainer)(implicit clock: Clock) extends RpcHandler with TestEditableServiceIF with StrictLogging { + + def addRow(key: String, data: Map[String, Any], vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + table.processUpdate(key, RowWithData(key, data), clock.now()) + ViewPortEditSuccess() + } + + def editRow(key: String, data: Map[String, Any], vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + table.processUpdate(key, RowWithData(key, data), clock.now()) + ViewPortEditSuccess() + } + + def editCell(key: String, column: String, data: Any, vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + table.processUpdate(key, RowWithData(key, Map("rowId" -> key, column -> data)), clock.now()) + ViewPortEditSuccess() + } + + def deleteRow(key: String, vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + table.processDelete(key) + ViewPortEditSuccess() + } + + def deleteCell(key: String, column: String, vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + table.processUpdate(key, RowWithData(key, Map("rowId" -> key, column -> null)), clock.now()) + ViewPortEditSuccess() + } + + def formSubmit(vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + //table.processUpdate(key, RowWithData(key, Map("rowId" -> key, column -> null)), clock.now()) + ViewPortEditSuccess() + } + + def formClose(vp: ViewPort, session: ClientSessionId): ViewPortEditAction = { + //table.processUpdate(key, RowWithData(key, Map("rowId" -> key, column -> null)), clock.now()) + ViewPortEditSuccess() + } + + override def deleteRowAction(): ViewPortDeleteRowAction = ViewPortDeleteRowAction("", deleteRow) + override def deleteCellAction(): ViewPortDeleteCellAction = ViewPortDeleteCellAction("", deleteCell) + override def addRowAction(): ViewPortAddRowAction = ViewPortAddRowAction("", addRow) + override def editCellAction(): ViewPortEditCellAction = ViewPortEditCellAction("", editCell) + override def editRowAction(): ViewPortEditRowAction = ViewPortEditRowAction("", editRow) + override def onFormSubmit(): ViewPortFormSubmitAction = ViewPortFormSubmitAction("", formSubmit) + override def onFormClose(): ViewPortFormCloseAction = ViewPortFormCloseAction("", formClose) +} + +object EditableTestModule { + + final val NAME = "EDITTEST" + + def apply()(implicit clock: Clock, lifecycle: LifecycleContainer, tableDefContainer: TableDefContainer): ViewServerModule = { + + ModuleFactory.withNamespace(NAME) + .addTable( + //this table should contain one row for each of .FTSE, .DJI, .HSI, .etc... + TableDef( + name = "editTestTable", + keyField = "rowId", + columns = Columns.fromNames("rowId".string(), "A".string(), "B".double(), "C".int(), "D".boolean()), + VisualLinks(), + joinFields = "rowId" + ), + (table, _) => new NullProvider(), + (table, _, _, tableContainer) => ViewPortDef( + columns = table.getTableDef.columns, + service = new TestEditableService(table, tableContainer) + ) + ).asModule() + + } + +} diff --git a/example/editable/src/test/scala/org/finos/vuu/core/module/editable/NullProvider.scala b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/NullProvider.scala new file mode 100644 index 000000000..ead6afcb4 --- /dev/null +++ b/example/editable/src/test/scala/org/finos/vuu/core/module/editable/NullProvider.scala @@ -0,0 +1,17 @@ +package org.finos.vuu.core.module.editable + +import org.finos.vuu.provider.Provider + +class NullProvider extends Provider { + override def subscribe(key: String): Unit = {} + + override def doStart(): Unit = {} + + override def doStop(): Unit = {} + + override def doInitialize(): Unit = {} + + override def doDestroy(): Unit = {} + + override val lifecycleId: String = "NullProvider" +} diff --git a/example/main/pom.xml b/example/main/pom.xml new file mode 100644 index 000000000..aaf040e2e --- /dev/null +++ b/example/main/pom.xml @@ -0,0 +1,297 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + + main + + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + basket + 0.5.09-SNAPSHOT + + + + org.finos.vuu + price + 0.5.09-SNAPSHOT + + + + org.finos.vuu + order + 0.5.09-SNAPSHOT + + + + org.finos.vuu + editable + 0.5.09-SNAPSHOT + + + + org.finos.vuu + permission + 0.5.09-SNAPSHOT + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + exec + + + + + java + + -Xmx10G + -classpath + + -Dvuu.webroot=../../vuu-ui/deployed_apps/app-vuu-example + -Dvuu.keyPath=src/main/resources/certs/key.pem + -Dvuu.certPath=src/main/resources/certs/cert.pem + -Dlogback.configurationFile=logback-netty.xml + org.finos.vuu.SimulMain + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/example/main/src/main/resources/FilterSpec.txt b/example/main/src/main/resources/FilterSpec.txt new file mode 100644 index 000000000..867fd1d16 --- /dev/null +++ b/example/main/src/main/resources/FilterSpec.txt @@ -0,0 +1,35 @@ +column > {value} +column < {value} +column == {value} +column != {value} +column in [{value},{value2},{value}] +column nin [{value},{value2},{value}] + + +compound clause: +columnA gt {value} && columnB lt {value} && columnC in [{value},{value2},{value}] +columnA gt {value} || columnB lt {value} + + +tradeTime > '2015-09-12 23:59' +quantity > 700 + + +FilterSpec(s: String) +SortSpec(s:String) + + +val pipeline = Pipeline.start(condition) + +Condition.evaluate(row) + +AndCondition() + +OrCondition(AndCondition, AndCondition) + + + + + + + diff --git a/example/main/src/main/resources/application.conf b/example/main/src/main/resources/application.conf new file mode 100644 index 000000000..ae9f4e088 --- /dev/null +++ b/example/main/src/main/resources/application.conf @@ -0,0 +1,3 @@ +vuu.webroot="vuu-ui/deployed_apps/app-vuu-example" +vuu.certPath="example/main/src/main/resources/certs/cert.pem" +vuu.keyPath="example/main/src/main/resources/certs/key.pem" \ No newline at end of file diff --git a/vuu/src/main/resources/certs/cert.pem b/example/main/src/main/resources/certs/cert.pem similarity index 100% rename from vuu/src/main/resources/certs/cert.pem rename to example/main/src/main/resources/certs/cert.pem diff --git a/vuu/src/main/resources/certs/key.pem b/example/main/src/main/resources/certs/key.pem similarity index 100% rename from vuu/src/main/resources/certs/key.pem rename to example/main/src/main/resources/certs/key.pem diff --git a/example/main/src/main/resources/down.gif b/example/main/src/main/resources/down.gif new file mode 100644 index 0000000000000000000000000000000000000000..284a755339830dfe06f8ad3268e0e5966f5aac8f GIT binary patch literal 76 zcmZ?wbhEHbjEB+I7E=o--Nlj5G&n(GMaQE~LU{L(Y!pOzI$e;sK a1X9kx#MjfmlIyLUoQaX|?oDy54AuY)gcExJ literal 0 HcmV?d00001 diff --git a/example/main/src/main/resources/icon-arrow-right.png b/example/main/src/main/resources/icon-arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..8908cf456fd3940d54f438c0068c8ca5e4166819 GIT binary patch literal 1062 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ za0`PlBg3pY5)2H?Cp=voLn`LHz3abbPO`}HkNS_|JAzbPOoF`rL<>l7R5DXaR4(ff z6)V$ejo|EFcf?Q1Y?Y$m8Ubz4uens5ztFqo}{CVH|J`l@TCj9djQJNDO|es$S~JD?%?K=9Sw zVfoKu8v^(8%n96C{&m56pbfVVRF>YpzUNm=15*uOOjIe;*`@D+!sQ1_P1^&?1%Vpx zH(G0-TiCZqYypFNWBaS#MS4o&3mA?!rmyl{d~K0uqanD+3;1f=Vj zh88n&eGn~hoqF<$$6KIjbq|(tZC=^f17yY@xGVbXGEXGX;QB`QNA6clW^x;>dVXm6 z6_=Y2`(KsT+%s@3`|$d;@`FV;3QhH_zkK|~w!^9hu&A|54N3HSQ=DzWAZD5 zg7^n_tQ4(ZWR~(&DCLzn)}8Qur3%#UQ?|qRweEvE3ydYUyh*ryCH=s)8Oajs-UQsf zW|vTX!jmVYY(eZR^9R#94!^i0s)v%blDX48lKK%MvL4f7+aH~sJ^ zQ@;FzPvEh_2L*1qf16JHTOW7(7vm1aCn{`O))&masuon9G2{s^TjBdU_Q4;B3uj;P z`(q=jW_>5~tNe$OJ1?64Oi;gi{{VAi@#~g13(Qx=H(D#TU-P_~*nfTd0n>@huS0G& zu3zup*qwa*>W()T+`qCF_2`9~%qJiIp0%BEhuDwFmk;0XpKi@}?CXK*HMNSxtQErR%cr8|Bw)s3 b{%*hSvyv9mt;uD;jLzWc>gTe~DWM4f`Z)04 literal 0 HcmV?d00001 diff --git a/vuu/src/main/resources/logback-netty.xml b/example/main/src/main/resources/logback-netty.xml similarity index 100% rename from vuu/src/main/resources/logback-netty.xml rename to example/main/src/main/resources/logback-netty.xml diff --git a/vuu/src/main/resources/logback-socket.xml b/example/main/src/main/resources/logback-socket.xml similarity index 100% rename from vuu/src/main/resources/logback-socket.xml rename to example/main/src/main/resources/logback-socket.xml diff --git a/vuu/src/main/resources/logback-trace.xml b/example/main/src/main/resources/logback-trace.xml similarity index 100% rename from vuu/src/main/resources/logback-trace.xml rename to example/main/src/main/resources/logback-trace.xml diff --git a/vuu/src/main/resources/logback.xml b/example/main/src/main/resources/logback.xml similarity index 100% rename from vuu/src/main/resources/logback.xml rename to example/main/src/main/resources/logback.xml diff --git a/example/main/src/main/resources/right.png b/example/main/src/main/resources/right.png new file mode 100644 index 0000000000000000000000000000000000000000..c853585f5beeaa6424aa4987e0fbde3c1339d611 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!3HF?%h*|g6id3JuOkD)`V;1?T`z%r$r9Iy zlHmNblJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsWw1GD?MEtLn>}1{rUgjo_Q^UFf%VB zw<2p#PtP2OSJsN9H=G(Irr&3K)a!7@ZPR5(vqy&=J}@rf>DbO}sIK{JLXri?`=hCh zrabHq4?CQ3);{d`Lqg#5R$cFaedwiwB@oIk9yp!J~v_l%7%m%8!&b?PnoCm(+# z$T}iml8Py>eZ#z&D^e}4#dz@^-hNr@_vDy@jRF&|TyyBYEu!$x)k`W>X46#}UtV?& a0|viRf78!?K@WhAX7F_Nb6Mw<&;$VfKxEVa literal 0 HcmV?d00001 diff --git a/example/main/src/main/resources/sort-arrow-down.gif b/example/main/src/main/resources/sort-arrow-down.gif new file mode 100644 index 0000000000000000000000000000000000000000..284a755339830dfe06f8ad3268e0e5966f5aac8f GIT binary patch literal 76 zcmZ?wbhEHbjEB+I7E=o--Nlj5G&n(GMaQE~LU{L(Y!pOzI$e;sK a1X9kx#MjfmlIyLUoQaX|?oDy54AuY)gcExJ literal 0 HcmV?d00001 diff --git a/example/main/src/main/resources/sort-arrow-up.gif b/example/main/src/main/resources/sort-arrow-up.gif new file mode 100644 index 0000000000000000000000000000000000000000..688f4c026a5cea77e4f7dc2f522b0edb3249d005 GIT binary patch literal 76 zcmZ?wbhEHbjEB+I7E=o--Nlj5G&n(GMaQE~LU{L(Y!pOzI$e;sK a1X9kx#MjfmvU&r9@SNPB?wR*k8LR;lvlL|j literal 0 HcmV?d00001 diff --git a/example/main/src/main/resources/static/ftse100.csv b/example/main/src/main/resources/static/ftse100.csv new file mode 100644 index 000000000..aa0315f95 --- /dev/null +++ b/example/main/src/main/resources/static/ftse100.csv @@ -0,0 +1,100 @@ +Symbol,Name,Last Trade,Change,Volume, Weighting +AAL.L,Anglo American PLC,436.35�13:13,�5.35�(1.24%),5799089,0.0278736825813547 +ABF.L,Associated British Foods PLC,"3,435.60�13:12",�7.40�(0.21%),86808,0.000417248060431947 +ADM.L,Admiral Group PLC,"1,627.00�13:13",,86808,0.000417248060431947 +ADN.L,Aberdeen Asset Management PLC,334.00�13:13,�2.50�(0.75%),806880,0.00387831899135251 +AHT.L,Ashtead Group PLC,"1,027.00�13:13",�6.00�(0.59%),331255,0.00159219779580666 +ANTO.L,Antofagasta PLC,484.10�13:13,�11.70�(2.48%),1753976,0.00843059492263598 +ARM.L,ARM Holdings PLC,"1,058.00�13:13",�3.00�(0.28%),475927,0.00228757277736148 +AV.L,Aviva PLC,493.97�13:13,�2.23�(0.45%),2226835,0.0107034211668507 +AZN.L,AstraZeneca PLC,"4,399.50�13:13",�2.50�(0.06%),815133,0.00391798755004232 +BA.L,BAE Systems PLC,478.10�13:13,�4.30�(0.91%),2039934,0.00980506986578636 +BAB.L,Babcock International Group PLC,988.00�13:13,�9.50�(0.97%),209614,0.00100752275066102 +BARC.L,Barclays PLC,226.30�13:13,�1.15�(0.51%),6575664,0.0316063387021032 +BATS.L,British American Tobacco PLC,"3,803.50�13:13",�8.50�(0.22%),465110,0.0022355801929258 +BDEV.L,Barratt Developments PLC,576.00�13:13,�0.50�(0.09%),1044365,0.00501980543997108 +BG.L,BG Group PLC,"1,013.50�13:13",�5.50�(0.55%),1507332,0.00724508516988073 +BKG.L,Berkeley Group Holdings (The) PLC,"3,126.00�13:13",�15.00�(0.48%),95071,0.000456964684744788 +BLND.L,British Land Co PLC,828.06�13:12,�10.44�(1.25%),1802548,0.00866405926683583 +BLT.L,BHP Billiton PLC,881.40�13:13,�4.30�(0.49%),4947287,0.0237794431982097 +BNZL.L,Bunzl PLC,"1,875.40�13:05",�4.60�(0.24%),104541,0.000502482829757812 +BP.L,BP PLC,381.50�13:13,�2.95�(0.78%),10493561,0.0504379547308349 +BRBY.L,Burberry Group PLC,"1,269.00�13:13",�7.00�(0.55%),295647,0.00142104572530785 +BT-A.L,BT Group PLC,489.20�13:13,�3.70�(0.75%),3914982,0.0188176048996174 +CCL.L,Carnival PLC,"3,426.00�13:12",�22.00�(0.64%),86257,0.000414599644602783 +CNA.L,Centrica PLC,212.80�13:13,�0.60�(0.28%),2144540,0.0103078651220939 +CPG.L,Compass Group PLC,"1,054.00�13:08",�5.00�(0.48%),1001167,0.00481217156158961 +CPI.L,Capita PLC,"1,235.00�13:11",�1.00�(0.08%),244591,0.0011756418803464 +CRH.L,CRH PLC,"1,783.20�13:12",�17.80�(0.99%),897325,0.00431304851888186 +DC.L,DIXONS CARPHONE,462.10�13:11,,756906,0.00363811584680332 +DGE.L,Diageo PLC,"1,881.50�13:13",�6.50�(0.34%),756906,0.00363811584680332 +DLG.L,Direct Line Insurance Group PLC,403.80�13:13,�0.40�(0.10%),1095340,0.00526481995338596 +EXPN.L,Experian PLC,"1,191.00�13:12",�2.00�(0.17%),467283,0.00224602485281105 +EZJ.L,easyJet PLC,"1,682.00�13:12",�28.00�(1.64%),1191230,0.00572572121265722 +FRES.L,Fresnillo PLC,678.50�13:12,�6.50�(0.97%),381871,0.00183548675335462 +GFS.L,G4S PLC,232.30�13:03,�2.00�(0.85%),1096551,0.00527064070033535 +GKN.L,GKN PLC,294.80�13:12,�2.50�(0.86%),792247,0.00380798456516713 +GLEN.L,Glencore PLC,90.48�13:13,�1.65�(1.86%),41631528,0.200104533116974 +GSK.L,GlaxoSmithKline PLC,"1,345.00�13:13",�0.50�(0.04%),1767356,0.00849490672625522 +HIK.L,Hikma Pharmaceuticals PLC,"2,010.00�13:04",�57.00�(2.92%),261511,0.00125696891451962 +HL.L,Hargreaves Lansdown PLC,"1,488.03�13:12",�9.97�(0.67%),372261,0.00178929568961912 +HMSO.L,Hammerson PLC,597.50�13:11,�3.50�(0.58%),478301,0.0022989835562697 +HSBA.L,HSBC Holdings PLC,519.70�13:13,�0.50�(0.10%),7415629,0.0356436828072631 +IAG.L,International Consolidated Airlines Group SA,575.40�13:12,�16.10�(2.72%),4311514,0.0207235606629018 +IHG.L,InterContinental Hotels Group PLC,"2,481.00�13:12",�19.00�(0.76%),219918,0.00105704956863507 +III.L,3i Group PLC,487.30�13:11,�4.50�(0.92%),189987,0.000913184352332553 +IMT.L,Imperial Tobacco Group PLC,"3,571.00�13:13",�29.00�(0.81%),926816,0.00445479884777089 +INTU.L,intu properties plc,319.90�13:09,�4.60�(1.42%),514821,0.0024745192115892 +ISAT.L,Inmarsat PLC,"1,054.44�13:13",�3.44�(0.33%),988089,0.00474931133978598 +ITRK.L,Intertek Group PLC,"2,643.00�13:14",�3.00�(0.11%),45868,0.000220467399731505 +ITV.L,ITV PLC,267.30�13:14,�2.60�(0.96%),3453208,0.0165980593985356 +JMAT.L,Johnson Matthey PLC,"2,445.00�13:14",�29.00�(1.20%),276397,0.00132851940096775 +KGF.L,Kingfisher PLC,346.20�13:14,�4.30�(1.23%),1021408,0.00490946118917235 +LAND.L,Land Securities Group PLC,"1,239.00�13:13",�7.00�(0.56%),384973,0.00185039670961971 +LGEN.L,Legal & General Group PLC,266.00�13:14,�1.60�(0.60%),1998399,0.00960542930051541 +LLOY.L,Lloyds Banking Group PLC,73.86�13:14,�0.02�(0.03%),18907878,0.0908818936317375 +LSE.L,London Stock Exchange Group PLC,"2,544.00�13:11",�6.00�(0.24%),129657,0.000623204448569543 +MGGT.L,Meggitt PLC,386.00�13:15,�3.20�(0.84%),611044,0.00293702105610748 +MKS.L,Marks & Spencer Group PLC,514.75�13:12,�3.25�(0.63%),920128,0.00442265255908587 +MNDI.L,Mondi PLC,"1,463.00�13:14",�7.00�(0.48%),383546,0.00184353774521278 +MRW.L,Morrison (Wm) Supermarkets PLC,155.20�13:14,,920128,0.00442265255908587 +NG.L,National Grid PLC,926.40�13:14,�1.10�(0.12%),1659592,0.00797693234619361 +NXT.L,Next PLC,"7,765.00�13:11",�95.00�(1.21%),114062,0.000548246109448308 +OML.L,Old Mutual PLC,198.50�13:14,�0.40�(0.20%),2040849,0.00980946787029396 +PRU.L,Prudential PLC,"1,499.50�13:15",�14.00�(0.93%),580870,0.00279198784516525 +PSON.L,Pearson PLC,794.00�13:09,�5.00�(0.63%),1177953,0.00566190448495522 +RB.L,Reckitt Benckiser Group PLC,"6,293.00�13:14",�34.00�(0.54%),281172,0.0013514707359664 +RBS.L,Royal Bank of Scotland Group PLC,313.40�13:14,�2.40�(0.77%),2100058,0.0100940596177149 +RDSA.L,Royal Dutch Shell PLC,"1,636.00�13:14",�18.00�(1.11%),2467461,0.0118600050276642 +RDSB.L,Royal Dutch Shell PLC,"1,652.00�13:15",�14.50�(0.89%),1457434,0.0070052473240666 +REL.L,Reed Elsevier PLC,"1,170.00�13:14",0.00�(0.00%),908802,0.00436821343443777 +RIO.L,Rio Tinto PLC,"2,235.00�13:15",�21.00�(0.95%),2190722,0.0105298417823887 +RMG.L,Royal Mail PLC,453.50�13:14,�1.20�(0.26%),995316,0.00478404836555252 +RR.L,Rolls-Royce Group PLC,546.63�13:14,�8.38�(1.51%),2792915,0.0134243199555489 +RRS.L,Randgold Resources Ltd,"3,929.00�13:14",0.00�(0.00%),135524,0.000651404549603483 +RSA.L,RSA Insurance Group PLC,437.10�13:14,�0.10�(0.02%),395477,0.00190088484005443 +SAB.L,SABMiller PLC,"4,011.00�13:15",�1.00�(0.02%),892451,0.00428962133421518 +SBRY.L,Sainsbury (J) PLC,255.80�13:14,�7.40�(2.98%),2395670,0.0115149371133421 +SDR.L,Schroders PLC,"2,930.00�13:09",�12.00�(0.41%),44674,0.000214728364341268 +SGE.L,Sage Group (The) PLC,545.50�13:13,�0.50�(0.09%),539717,0.00259418338669419 +SHP.L,Shire PLC,"4,685.00�13:14",�22.00�(0.47%),221318,0.0010637787558598 +SKY.L,SKY,"1,095.00�13:12",�4.00�(0.37%),925016,0.0044461470356248 +SL.L,Standard Life PLC,399.90�13:14,�3.20�(0.79%),861636,0.00414150711683647 +SMIN.L,Smiths Group PLC,992.50�13:14,�27.50�(2.70%),640309,0.00307768510191594 +SN.L,Smith & Nephew PLC,"1,110.00�13:14",�9.00�(0.82%),480018,0.00230723642374461 +SPD.L,Sports Direct International PLC,694.50�13:11,�1.50�(0.22%),157981,0.000759345519250522 +SSE.L,SSE PLC,"1,463.00�13:13",�2.00�(0.14%),562454,0.00270347019378617 +STAN.L,Standard Chartered PLC,583.00�13:14,�0.60�(0.10%),2018697,0.00970299290214945 +STJ.L,St James's Place PLC,964.00�13:14,�11.00�(1.13%),418480,0.00201145019271912 +SVT.L,Severn Trent PLC,"2,199.00�13:12",�1.00�(0.05%),95342,0.000458267263129005 +TPK.L,Travis Perkins PLC,"1,945.00�13:13",�4.00�(0.21%),92916,0.000446606542981001 +TSCO.L,Tesco PLC,171.54�13:14,�2.54�(1.50%),9831136,0.0472539676970174 +TUI.L,TUI AG,"1,115.00�13:10",�5.00�(0.45%),458970,0.00220606790038304 +TW.L,Taylor Wimpey PLC,183.90�13:15,�1.10�(0.59%),3180729,0.0152883721086725 +ULVR.L,Unilever PLC,"2,791.00�13:14",�29.00�(1.03%),824827,0.0039645823650113 +UU.L,United Utilities Group PLC,959.00�13:10,�2.50�(0.26%),436911,0.00210003994253274 +VOD.L,Vodafone Group PLC,224.25�13:15,�1.30�(0.58%),17572036,0.0844610858312637 +WOS.L,Wolseley PLC,"3,657.00�13:14",�4.00�(0.11%),179536,0.000862950969699912 +WPP.L,WPP PLC,"1,502.00�13:15",�12.00�(0.79%),857887,0.0041234873147611 +WTB.L,Whitbread PLC,"4,484.00�13:16",�60.00�(1.32%),141036,0.000677898321019722 +,,,,208048900, diff --git a/example/main/src/main/resources/static/hsi.csv b/example/main/src/main/resources/static/hsi.csv new file mode 100644 index 000000000..fcd24d46c --- /dev/null +++ b/example/main/src/main/resources/static/hsi.csv @@ -0,0 +1,81 @@ +Name,Symbol,Last,Change,Change %,Volume,Turn.,P/E,P/B,Yield,Market Cap,Weighting +CKH HOLDINGS,00001.HK,41.9,1.15,+2.822%,5.15M,215.13M,4.38,0.31,6.98%,160.48B,0.0278736825813547 +CLP HOLDINGS,00002.HK,57.95,-0.1,-0.172%,3.32M,193.19M,156.62,1.39,5.35%,146.41B,0.000417248060431947 +HK & CHINA GAS,00003.HK,5.46,0.13,+2.439%,16.16M,88.00M,19.43,1.66,6.41%,101.88B,0.000417248060431947 +HSBC HOLDINGS,00005.HK,61.7,1.1,+1.815%,22.19M,1.37B,10.54,0.86,4.05%,1,0.00387831899135251 +POWER ASSETS,00006.HK,37.9,-0.25,-0.655%,4.23M,160.75M,14.3,0.93,7.44%,80.77B,0.00159219779580666 +HANG SENG BANK,00011.HK,97.45,2.95,+3.122%,2.54M,247.44M,19.69,1.01,4.21%,186.31B,0.00843059492263598 +HENDERSON LAND,00012.HK,20.65,0.85,+4.293%,5.07M,103.70M,10.81,0.31,8.72%,99.97B,0.00228757277736148 +SHK PPT,00016.HK,83.8,3.25,+4.035%,8.25M,685.41M,10.16,0.4,5.91%,242.83B,0.0107034211668507 +NEW WORLD DEV,00017.HK,15.24,0.8,+5.540%,12.95M,196.19M,30.48,0.18,13.52%,38.35B,0.00391798755004232 +GALAXY ENT,00027.HK,47.15,1.9,+4.199%,11.97M,560.21M,No Profit,3.22,0.00%,206.21B,0.00980506986578636 +MTR CORPORATION,00066.HK,31,0.8,+2.649%,4.68M,144.86M,19.5,1.07,4.23%,192.64B,0.00100752275066102 +HANG LUNG PPT,00101.HK,10.72,0.56,+5.512%,7.68M,81.99M,12.61,0.36,7.28%,48.23B,0.0316063387021032 +GEELY AUTO,00175.HK,9.24,0.17,+1.874%,18.77M,173.30M,16.06,1.15,2.27%,92.99B,0.0022355801929258 +ALI HEALTH,00241.HK,4.88,0.47,+10.658%,53.62M,257.82M,108.09,3.81,0.00%,66.04B,0.00501980543997108 +CITIC,00267.HK,7.2,0.2,+2.857%,11.54M,82.96M,2.78,0.28,9.04%,209.45B,0.00724508516988073 +WH GROUP,00288.HK,4.11,0.08,+1.985%,18.94M,77.65M,4.93,0.7,7.30%,52.73B,0.000456964684744788 +CHINA RES BEER,00291.HK,42.95,1.2,+2.874%,4.83M,207.98M,28.41,4.57,1.41%,139.34B,0.00866405926683583 +OOIL,00316.HK,104.5,-0.4,-0.381%,296.54K,30.98M,0.89,0.66,78.90%,69.01B,0.0237794431982097 +TINGYI,00322.HK,10.94,0.18,+1.673%,2.91M,31.81M,20.75,4.09,9.39%,61.64B,0.000502482829757812 +SINOPEC CORP,00386.HK,4.28,-0.01,-0.233%,92.43M,396.61M,6.94,0.58,9.36%,105.92B,0.0504379547308349 +HKEX,00388.HK,292.6,9,+3.173%,4.61M,1.34B,36.76,7.46,2.44%,370.97B,0.00142104572530785 +TECHTRONIC IND,00669.HK,76,1.35,+1.808%,5.47M,414.78M,16.54,3.43,2.43%,139.45B,0.0188176048996174 +CHINA OVERSEAS,00688.HK,16.24,0.52,+3.308%,13.15M,212.60M,6.76,0.44,4.93%,177.74B,0.000414599644602783 +TENCENT,00700.HK,306.2,8.8,+2.959%,11.25M,3.43B,13.74,3.6,0.78%,2,0.0103078651220939 +CHINA UNICOM,00762.HK,5.68,-0.05,-0.873%,9.23M,52.77M,9.16,0.45,5.44%,173.80B,0.00481217156158961 +LINK REIT,00823.HK,38.4,1.45,+3.924%,12.04M,460.96M,5.42,0.52,7.03%,98.38B,0.0011756418803464 +CHINA RES POWER,00836.HK,14.94,0.32,+2.189%,9.91M,147.81M,10.23,0.87,3.92%,71.87B,0.00431304851888186 +PETROCHINA,00857.HK,5.9,0,0.000%,64.23M,380.44M,6.38,0.7,8.08%,124.48B,0.00363811584680332 +XINYI GLASS,00868.HK,10.14,0.17,+1.705%,3.75M,38.02M,8.01,1.3,6.11%,42.22B,0.00363811584680332 +ZHONGSHENG HLDG,00881.HK,22.05,1.45,+7.039%,6.76M,147.71M,7.08,1.07,4.94%,52.72B,0.00526481995338596 +CNOOC,00883.HK,13.78,-0.02,-0.145%,26.37M,365.08M,4.03,0.97,19.09%,655.47B,0.00224602485281105 +CCB,00939.HK,4.42,0.06,+1.376%,233.61M,1.03B,3.06,0.35,9.93%,1,0.00572572121265722 +CHINA MOBILE,00941.HK,65.7,0.25,+0.382%,7.82M,516.10M,9.91,0.96,6.71%,1,0.00183548675335462 +LONGFOR GROUP,00960.HK,14.08,0.9,+6.829%,10.88M,150.68M,3.06,0.55,9.05%,92.81B,0.00527064070033535 +XINYI SOLAR,00968.HK,5.86,0.28,+5.018%,15.99M,92.88M,13.64,1.75,3.41%,52.17B,0.00380798456516713 +SMIC,00981.HK,20.05,0.25,+1.263%,13.10M,264.32M,11.17,1.06,0.00%,159.31B,0.200104533116974 +LENOVO GROUP,00992.HK,8.07,0.25,+3.197%,33.60M,270.50M,7.61,2.23,4.71%,97.87B,0.00849490672625522 +CKI HOLDINGS,01038.HK,37.05,-0.2,-0.537%,1.44M,53.73M,12.03,0.78,6.83%,93.35B,0.00125696891451962 +HENGAN INT'L,01044.HK,24.95,0.2,+0.808%,2.62M,64.97M,13.35,1.32,6.33%,28.99B,0.00178929568961912 +CHINA SHENHUA,01088.HK,25.4,0.35,+1.397%,7.98M,203.11M,6.14,1.13,11.33%,85.79B,0.0022989835562697 +CSPC PHARMA,01093.HK,5.74,0.05,+0.879%,29.29M,167.41M,9.96,2.01,3.66%,68.32B,0.0356436828072631 +SINOPHARM,01099.HK,22.7,0.2,+0.889%,2.07M,46.80M,7.37,0.92,4.08%,30.46B,0.0207235606629018 +CHINA RES LAND,01109.HK,31.2,1,+3.311%,9.88M,305.88M,7.02,0.81,5.07%,222.49B,0.00105704956863507 +CK ASSET,01113.HK,41.25,1.25,+3.125%,8.57M,352.44M,6.9,0.39,5.53%,146.47B,0.000913184352332553 +SINO BIOPHARM,01177.HK,2.83,0.02,+0.712%,26.30M,74.09M,18.37,1.59,4.24%,53.21B,0.00445479884777089 +CHINA RES MIXC,01209.HK,31.6,1.6,+5.333%,3.07M,96.42M,28.97,4.48,2.87%,72.13B,0.0024745192115892 +BYD COMPANY,01211.HK,242,7,+2.979%,3.90M,938.50M,37.57,5.63,0.53%,265.72B,0.00474931133978598 +AIA,01299.HK,63.85,0.95,+1.510%,38.75M,2.48B,408.88,2.53,2.41%,735.40B,0.000220467399731505 +CHINAHONGQIAO,01378.HK,7.67,0.28,+3.789%,13.05M,99.58M,7.27,0.76,6.65%,72.68B,0.0165980593985356 +ICBC,01398.HK,3.77,0.07,+1.892%,233.48M,881.67M,3.45,0.36,9.08%,327.21B,0.00132851940096775 +XIAOMI-W,01810.HK,12.34,0.62,+5.290%,78.53M,960.98M,109.39,1.9,0.00%,308.83B,0.00490946118917235 +BUD APAC,01876.HK,15.46,0.16,+1.046%,16.17M,250.45M,28.65,2.44,1.91%,204.74B,0.00185039670961971 +SANDS CHINA LTD,01928.HK,24,0.95,+4.121%,19.98M,475.93M,No Profit,N/A,0.00%,194.24B,0.00960542930051541 +CHOW TAI FOOK,01929.HK,11.8,0.28,+2.431%,4.88M,57.68M,21.93,3.64,10.34%,118.00B,0.0908818936317375 +WHARF REIC,01997.HK,30.25,1.4,+4.853%,4.23M,127.31M,No Profit,0.48,4.33%,91.85B,0.000623204448569543 +ANTA SPORTS,02020.HK,88.15,4.4,+5.254%,4.82M,422.51M,27.71,6.16,1.52%,249.70B,0.00293702105610748 +WUXI BIO,02269.HK,45.65,1.55,+3.515%,17.91M,811.49M,38.18,4.88,0.00%,194.01B,0.00442265255908587 +SHENZHOU INTL,02313.HK,75,4.6,+6.534%,5.52M,410.68M,21.87,3.25,2.55%,112.74B,0.00184353774521278 +PING AN,02318.HK,44.85,0.85,+1.932%,23.05M,1.03B,8.28,0.85,6.09%,334.02B,0.00442265255908587 +MENGNIU DAIRY,02319.HK,26.25,1.5,+6.061%,8.58M,223.15M,17.34,2.3,1.73%,103.42B,0.00797693234619361 +LI NING,02331.HK,32.95,1.5,+4.769%,22.54M,738.37M,18.8,3.16,1.58%,86.86B,0.000548246109448308 +SUNNY OPTICAL,02382.HK,54.7,1.05,+1.957%,5.62M,308.60M,22.01,2.44,0.91%,60.00B,0.00980946787029396 +BOC HONG KONG,02388.HK,21.45,0.3,+1.418%,6.53M,140.32M,8.38,0.75,6.33%,226.79B,0.00279198784516525 +CHINA LIFE,02628.HK,12.2,0.24,+2.007%,13.53M,165.07M,9.49,0.7,4.53%,90.78B,0.00566190448495522 +ENN ENERGY,02688.HK,65,1.15,+1.801%,3.06M,198.69M,11.08,1.67,4.48%,73.53B,0.0013514707359664 +ZIJIN MINING,02899.HK,11.98,0.16,+1.354%,16.20M,194.50M,13.97,3.14,1.88%,68.73B,0.0100940596177149 +MEITUAN-W,03690.HK,114.6,3.8,+3.430%,19.17M,2.19B,No Profit,4.89,0.00%,715.43B,0.0118600050276642 +HANSOH PHARMA,03692.HK,10.66,0.16,+1.524%,17.56M,187.72M,21.48,2.47,0.94%,63.25B,0.0070052473240666 +CM BANK,03968.HK,32.7,0.1,+0.307%,11.13M,363.99M,5.51,0.86,6.00%,150.12B,0.00436821343443777 +BANK OF CHINA,03988.HK,2.74,0.05,+1.859%,275.47M,754.54M,3.33,0.33,9.55%,229.13B,0.0105298417823887 +CG SERVICES,06098.HK,8.08,0.25,+3.193%,16.08M,128.87M,12.42,0.65,5.20%,27.01B,0.00478404836555252 +JD HEALTH,06618.HK,40.6,2.95,+7.835%,7.75M,312.36M,299.91,2.56,0.00%,129.12B,0.0134243199555489 +HAIER SMARTHOME,06690.HK,24.65,1.15,+4.894%,7.24M,178.37M,13.83,2.21,2.59%,70.46B,0.000651404549603483 +HAIDILAO,06862.HK,21,0.6,+2.941%,6.86M,143.79M,74.46,13.94,0.55%,117.05B,0.00190088484005443 +JD-SW,09618.HK,115.1,4,+3.600%,7.43M,852.28M,30.73,1.5,6.38%,360.24B,0.00428962133421518 +NONGFU SPRING,09633.HK,45,1.5,+3.448%,3.69M,165.62M,52.49,18.63,1.71%,226.56B,0.0115149371133421 +BIDU-SW,09888.HK,133.4,4.6,+3.571%,5.82M,772.73M,47.3,1.5,0.00%,377.37B,0.000214728364341268 +TRIP.COM-S,09961.HK,279.2,7,+2.572%,1.25M,349.59M,114.05,1.4,0.00%,176.65B,0.00259418338669419 +BABA-SW,09988.HK,85.6,2.6,+3.133%,34.61M,2.96B,21.65,1.62,0.00%,1,0.0010637787558598 +NTES-S,09999.HK,159.5,8.3,+5.489%,5.02M,797.10M,22.7,4.63,1.36%,546.99B,0.0044461470356248 diff --git a/example/main/src/main/resources/static/nasdaq100.csv b/example/main/src/main/resources/static/nasdaq100.csv new file mode 100644 index 000000000..6447cbb7a --- /dev/null +++ b/example/main/src/main/resources/static/nasdaq100.csv @@ -0,0 +1,102 @@ +#,Name,Symbol,Weighting,Last Trade,Chg,% Chg +1,Apple Inc,AAPL,11.007,174.94,0.15,(0.09%) +2,Microsoft Corp,MSFT,9.61,316.98,-0.03,(-0.01%) +3,Amazon.com Inc,AMZN,5.401,129.31,0.19,(0.14%) +4,NVIDIA Corp,NVDA,4.101,415.74,-0.36,(-0.09%) +5,Meta Platforms Inc,META,3.729,299.42,0.34,(0.11%) +6,Tesla Inc,TSLA,3.285,244.13,-0.75,(-0.31%) +7,Alphabet Inc,GOOGL,3.133,130.49,0.24,(0.18%) +8,Alphabet Inc,GOOG,3.085,131.49,0.24,(0.18%) +9,Broadcom Inc,AVGO,2.896,833.04,3.96,(0.48%) +10,Costco Wholesale Corp,COST,2.137,557.85,-0.74,(-0.13%) +11,PepsiCo Inc,PEP,2.096,174.84,-0.43,(-0.25%) +12,Adobe Inc,ADBE,2.033,511.42,-1.48,(-0.29%) +13,Cisco Systems Inc,CSCO,1.887,53.68,0.11,(0.20%) +14,Comcast Corp,CMCSA,1.633,45.30,-0.01,(-0.01%) +15,Netflix Inc,NFLX,1.478,379.89,0.08,(0.02%) +16,T-Mobile US Inc,TMUS,1.43,140.18,0.83,(0.60%) +17,Advanced Micro Devices Inc,AMD,1.348,96.09,-0.11,(-0.12%) +18,Texas Instruments Inc,TXN,1.264,161.00,0.69,(0.43%) +19,Intel Corp,INTC,1.26,34.19,0.01,(0.01%) +20,Amgen Inc,AMGN,1.251,271.18,3.48,(1.30%) +21,Intuit Inc,INTU,1.226,509.00,0.43,(0.08%) +22,Honeywell International Inc,HON,1.103,188.67,-1.12,(-0.59%) +23,QUALCOMM Inc,QCOM,1.046,107.53,-0.16,(-0.14%) +24,Applied Materials Inc,AMAT,0.982,136.32,0.15,(0.11%) +25,Booking Holdings Inc,BKNG,0.941,3,019.20,-43.30,(-1.42%) +26,Starbucks Corp,SBUX,0.926,93.80,0.12,(0.12%) +27,Intuitive Surgical Inc,ISRG,0.867,288.50,0.30,(0.10%) +28,Automatic Data Processing Inc,ADP,0.854,239.45,0.10,(0.04%) +29,Mondelez International Inc,MDLZ,0.835,71.25,0.82,(1.16%) +30,Gilead Sciences Inc,GILD,0.814,75.47,0.46,(0.61%) +31,Vertex Pharmaceuticals Inc,VRTX,0.794,353.67,4.14,(1.18%) +32,Regeneron Pharmaceuticals Inc,REGN,0.763,828.09,3.25,(0.39%) +33,Analog Devices Inc,ADI,0.752,176.82,1.34,(0.76%) +34,Lam Research Corp,LRCX,0.702,620.00,0.89,(0.14%) +35,Micron Technology Inc,MU,0.646,68.90,0.02,(0.03%) +36,Palo Alto Networks Inc,PANW,0.604,228.70,0.19,(0.08%) +37,Synopsys Inc,SNPS,0.587,447.12,0.27,(0.06%) +38,Charter Communications Inc,CHTR,0.581,441.88,-3.33,(-0.75%) +39,MercadoLibre Inc,MELI,0.562,1,275.50,-1.47,(-0.11%) +40,PayPal Holdings Inc,PYPL,0.559,57.90,0.02,(0.03%) +41,CSX Corp,CSX,0.54,31.23,0.03,(0.09%) +42,Cadence Design Systems Inc,CDNS,0.539,230.83,0.17,(0.07%) +43,KLA Corp,KLAC,0.53,456.11,4.29,(0.95%) +44,PDD Holdings Inc ADR,PDD,0.521,95.93,-0.01,(-0.01%) +45,Marriott International Inc/MD,MAR,0.505,193.90,-0.46,(-0.23%) +46,Monster Beverage Corp,MNST,0.498,54.48,-0.04,(-0.08%) +47,Airbnb Inc,ABNB,0.491,132.09,-0.11,(-0.08%) +48,O'Reilly Automotive Inc,ORLY,0.485,936.67,0.65,(0.07%) +49,Cintas Corp,CTAS,0.446,505.27,0.52,(0.10%) +50,ASML Holding NV,ASML,0.438,585.00,-2.10,(-0.36%) +51,NXP Semiconductors NV,NXPI,0.434,196.76,-0.04,(-0.02%) +52,Workday Inc,WDAY,0.414,235.55,4.73,(2.05%) +53,Lululemon Athletica Inc,LULU,0.405,386.36,-1.69,(-0.44%) +54,Keurig Dr Pepper Inc,KDP,0.404,33.25,0.13,(0.39%) +55,Fortinet Inc,FTNT,0.401,58.29,0.05,(0.09%) +56,Marvell Technology Inc,MRVL,0.388,52.38,0.08,(0.14%) +57,PACCAR Inc,PCAR,0.38,84.97,0.04,(0.04%) +58,Old Dominion Freight Line Inc,ODFL,0.38,401.01,0.35,(0.09%) +59,Autodesk Inc,ADSK,0.379,204.07,0.03,(0.01%) +60,Kraft Heinz Co/The,KHC,0.368,34.27,0.11,(0.31%) +61,Microchip Technology Inc,MCHP,0.36,77.00,-0.08,(-0.10%) +62,Copart Inc,CPRT,0.358,43.26,0.10,(0.22%) +63,American Electric Power Co Inc,AEP,0.357,79.23,0.06,(0.08%) +64,Paychex Inc,PAYX,0.355,113.01,0.06,(0.06%) +65,Exelon Corp,EXC,0.35,40.28,0.07,(0.16%) +66,ON Semiconductor Corp,ON,0.341,93.87,0.06,(0.06%) +67,AstraZeneca PLC ADR,AZN,0.339,67.35,-0.49,(-0.72%) +68,Seagen Inc,SGEN,0.336,212.18,-1.52,(-0.71%) +69,Ross Stores Inc,ROST,0.335,111.71,0.05,(0.04%) +70,Moderna Inc,MRNA,0.331,100.32,0.33,(0.33%) +71,Biogen Inc,BIIB,0.326,257.93,0.25,(0.10%) +72,Crowdstrike Holdings Inc,CRWD,0.319,162.85,0.28,(0.17%) +73,IDEXX Laboratories Inc,IDXX,0.316,439.41,3.72,(0.85%) +74,Baker Hughes Co,BKR,0.307,35.44,0.04,(0.10%) +75,Constellation Energy Corp,CEG,0.307,110.41,0.05,(0.04%) +76,Cognizant Technology Solutions Corp,CTSH,0.303,70.19,0.58,(0.83%) +77,Verisk Analytics Inc,VRSK,0.303,242.05,0.10,(0.04%) +78,Dexcom Inc,DXCM,0.3,88.30,0.80,(0.92%) +79,Trade Desk Inc/The,TTD,0.293,76.38,0.03,(0.03%) +80,Xcel Energy Inc,XEL,0.284,59.76,0.03,(0.04%) +81,Electronic Arts Inc,EA,0.279,118.38,-0.63,(-0.53%) +82,CoStar Group Inc,CSGP,0.277,78.18,0.12,(0.15%) +83,GLOBALFOUNDRIES Inc,GFS,0.273,57.21,0.38,(0.67%) +84,Fastenal Co,FAST,0.268,54.32,0.11,(0.20%) +85,Atlassian Corp,TEAM,0.253,196.01,0.55,(0.28%) +86,GE HealthCare Technologies Inc,GEHC,0.252,63.78,-0.56,(-0.86%) +87,Warner Bros Discovery Inc,WBD,0.244,11.09,-0.02,(-0.14%) +88,Diamondback Energy Inc,FANG,0.235,150.70,0.13,(0.09%) +89,Datadog Inc,DDOG,0.23,88.81,0.05,(0.06%) +90,ANSYS Inc,ANSS,0.227,300.60,-2.31,(-0.76%) +91,eBay Inc,EBAY,0.203,43.22,0.09,(0.20%) +92,Dollar Tree Inc,DLTR,0.201,104.77,0.27,(0.25%) +93,Align Technology Inc,ALGN,0.2,297.25,-1.31,(-0.44%) +94,Zscaler Inc,ZS,0.188,151.80,0.09,(0.06%) +95,Illumina Inc,ILMN,0.183,132.31,-0.13,(-0.10%) +96,Walgreens Boots Alliance Inc,WBA,0.161,21.18,0.06,(0.28%) +97,Zoom Video Communications Inc,ZM,0.151,68.57,-0.29,(-0.41%) +98,Enphase Energy Inc,ENPH,0.148,120.41,0.49,(0.41%) +99,Sirius XM Holdings Inc,SIRI,0.137,4.05,0.02,(0.50%) +100,JD.com Inc ADR,JD,0.117,30.43,0.02,(0.05%) +101,Lucid Group Inc,LCID,0.102,5.14,0.03,(0.49%) \ No newline at end of file diff --git a/example/main/src/main/resources/static/sp500.csv b/example/main/src/main/resources/static/sp500.csv new file mode 100644 index 000000000..19701b2cc --- /dev/null +++ b/example/main/src/main/resources/static/sp500.csv @@ -0,0 +1,504 @@ +#,Name,Symbol,Weighting,Price,Change,Change %, +1,Apple Inc,AAPL,6.992488,171.9,1.47,(0.86%), +2,Microsoft Corp,MSFT,6.487978,314.55,1.76,(0.56%), +3,Amazon.com Inc,AMZN,3.193379,126.25,0.27,(0.22%), +4,Nvidia Corp,NVDA,2.928461,433.11,8.43,(1.99%), +5,Alphabet Inc Cl A,GOOGL,2.162218,132.93,2.39,(1.83%), +6,Tesla Inc,TSLA,1.854311,246.56,6.06,(2.52%), +7,Alphabet Inc Cl C,GOOG,1.85251,133.81,2.35,(1.78%), +8,Meta Platforms Inc Class A,META,1.847731,305.93,8.19,(2.75%), +9,Berkshire Hathaway Inc Cl B,BRK.B,1.82184,358.67,0.89,(0.25%), +10,Exxon Mobil Corp,XOM,1.343563,118.97,-1.23,(-1.03%), +11,Unitedhealth Group Inc,UNH,1.302884,510.04,6.31,(1.25%), +12,Eli Lilly & Co,LLY,1.224046,546.65,-3.11,(-0.57%), +13,Jpmorgan Chase & Co,JPM,1.182918,148.23,2.45,(1.68%), +14,Johnson & Johnson W/d,JNJ,1.056344,156.83,-0.28,(-0.18%), +15,Visa Inc Class a Shares,V,1.029636,231.97,2.47,(1.08%), +16,Procter & Gamble Co,PG,0.969793,145.75,-1.59,(-1.08%), +17,Broadcom Inc,AVGO,0.941177,835.33,18.52,(2.27%), +18,Mastercard Inc A,MA,0.918779,400.65,5.17,(1.31%), +19,Chevron Corp,CVX,0.847353,170.55,-0.49,(-0.28%), +20,Home Depot Inc,HD,0.847289,304.35,2.53,(0.84%), +22,Abbvie Inc,ABBV,0.754672,152.14,-0.99,(-0.65%), +23,Merck & Co. Inc.,MRK,0.736434,104.2,0.26,(0.25%), +24,Costco Wholesale Corp,COST,0.697258,569.05,5.52,(0.98%), +25,Pepsico Inc,PEP,0.651768,168.92,-0.65,(-0.38%), +26,Walmart Inc,WMT,0.644449,161.87,0.15,(0.09%), +27,Adobe Inc,ADBE,0.639652,507.17,4.57,(0.91%), +28,Coca Cola Co,KO,0.60801,55.82,-0.13,(-0.23%), +29,Cisco Systems Inc,CSCO,0.605326,53.97,0.77,(1.44%), +30,Accenture Plc Cl A,ACN,0.55372,298.5,-15.9,(-5.05%), +31,Salesforce Inc,CRM,0.551342,204.46,1.73,(0.85%), +32,Thermo Fisher Scientific Inc,TMO,0.536951,503.47,5.18,(1.04%), +33,Mcdonald S Corp,MCD,0.536457,265.83,2.19,(0.83%), +34,Bank of America Corp,BAC,0.526405,27.51,0.24,(0.86%), +35,Comcast Corp Class A,CMCSA,0.512537,45.17,0.57,(1.27%), +36,Linde Plc,LIN,0.506835,375.48,3.47,(0.93%), +37,Pfizer Inc,PFE,0.506043,32.09,-0.02,(-0.05%), +38,Netflix Inc,NFLX,0.467192,377.77,0.18,(0.05%), +39,Abbott Laboratories,ABT,0.462893,97.52,1.99,(2.08%), +40,Oracle Corp,ORCL,0.459877,106.29,1.67,(1.60%), +41,Danaher Corp,DHR,0.454026,248.24,0.8,(0.32%), +42,Advanced Micro Devices,AMD,0.442473,103.74,5.67,(5.78%), +43,Wells Fargo & Co,WFC,0.417428,41.04,0.18,(0.43%), +44,Conocophillips,COP,0.411569,123.32,0.23,(0.18%), +45,Walt Disney Co,DIS,0.408438,80.35,0.45,(0.56%), +46,Intel Corp,INTC,0.404462,35.5,0.89,(2.56%), +47,Amgen Inc,AMGN,0.401904,270.91,1.93,(0.72%), +48,Texas Instruments Inc,TXN,0.400931,160.98,2.84,(1.80%), +49,Intuit Inc,INTU,0.397406,515.11,6.87,(1.35%), +50,Philip Morris International,PM,0.39143,92.66,2.34,(2.59%), +51,Caterpillar Inc,CAT,0.388444,276.34,3.63,(1.33%), +52,Verizon Communications Inc,VZ,0.380327,32.56,0.16,(0.48%), +53,Intl Business Machines Corp,IBM,0.364246,140.89,-2.28,(-1.59%), +54,Honeywell International Inc,HON,0.348317,188.68,0.8,(0.43%), +55,Union Pacific Corp,UNP,0.344419,203.88,1.48,(0.73%), +56,Qualcomm Inc,QCOM,0.340195,111.55,2.36,(2.16%), +57,Nextera Energy Inc,NEE,0.338809,57.64,-2.32,(-3.88%), +58,Lowe S Cos Inc,LOW,0.338613,209.52,2.56,(1.24%), +59,Bristol Myers Squibb Co,BMY,0.337683,58.3,0.41,(0.70%), +60,General Electric Co,GE,0.336989,112.43,1.54,(1.39%), +61,S&p Global Inc,SPGI,0.32985,369.21,6.15,(1.69%), +62,Applied Materials Inc,AMAT,0.316678,139.15,4.09,(3.03%), +63,Servicenow Inc,NOW,0.3112,552.84,6.46,(1.18%), +64,Boeing Co,BA,0.309673,193.12,-2.34,(-1.20%), +65,United Parcel Service Cl B,UPS,0.307795,154.29,1.88,(1.23%), +66,Booking Holdings Inc,BKNG,0.307126,3,86.26,3.6,(0.12%) +67,Nike Inc Cl B,NKE,0.305871,89.63,0.21,(0.24%), +68,At&t Inc,T,0.296603,14.94,0.07,(0.44%), +69,Goldman Sachs Group Inc,GS,0.296356,325.72,3.77,(1.17%), +70,Rtx Corp,RTX,0.296189,72.54,-0.34,(-0.46%), +71,Elevance Health Inc,ELV,0.292632,448.99,4.23,(0.95%), +72,Deere & Co,DE,0.291602,388.36,4,(1.04%), +73,Starbucks Corp,SBUX,0.291579,91.21,0.04,(0.04%), +74,Morgan Stanley,MS,0.29087,82.34,0.69,(0.84%), +75,Medtronic Plc,MDT,0.290688,78.77,0.55,(0.71%), +76,Prologis Inc,PLD,0.286912,112.3,1.05,(0.94%), +77,Intuitive Surgical Inc,ISRG,0.285764,296.31,4.88,(1.67%), +78,Tjx Companies Inc,TJX,0.282733,89.27,1.16,(1.32%), +79,Automatic Data Processing,ADP,0.279113,243.79,1.16,(0.48%), +80,Marsh & Mclennan Cos,MMC,0.266169,193.53,0.55,(0.29%), +81,Mondelez International Inc A,MDLZ,0.26425,69.44,-0.56,(-0.79%), +82,Gilead Sciences Inc,GILD,0.26285,75.96,0.41,(0.54%), +83,Lockheed Martin Corp,LMT,0.255775,410.4,1.68,(0.41%), +84,Blackrock Inc,BLK,0.252096,645.37,1.98,(0.31%), +85,Vertex Pharmaceuticals Inc,VRTX,0.251521,353.91,4.26,(1.22%), +86,Stryker Corp,SYK,0.250789,273.07,6.53,(2.45%), +87,Cvs Health Corp,CVS,0.250255,70.11,0.33,(0.47%), +88,Regeneron Pharmaceuticals,REGN,0.2481,835.67,3.11,(0.37%), +89,American Express Co,AXP,0.243515,150.42,0.52,(0.34%), +90,Chubb Ltd,CB,0.242706,212.92,1.29,(0.61%), +91,Analog Devices Inc,ADI,0.241943,177.01,4.2,(2.43%), +92,Schlumberger Ltd,SLB,0.241232,61.02,0.22,(0.36%), +93,Eaton Corp Plc,ETN,0.238556,216.42,2.06,(0.96%), +94,The Cigna Group,CI,0.238517,291.43,2.82,(0.98%), +95,Progressive Corp,PGR,0.229854,140.76,0.14,(0.10%), +96,Lam Research Corp,LRCX,0.228483,627.46,13.54,(2.20%), +97,Schwab (Charles) Corp,SCHW,0.225784,54.57,0.19,(0.35%), +98,Zoetis Inc,ZTS,0.224522,174.68,0,(-0.00%), +99,Citigroup Inc,C,0.217552,41.24,0.78,(1.92%), +100,Boston Scientific Corp,BSX,0.213003,53.3,1.2,(2.31%), +101,Blackstone Inc,BX,0.211158,108.88,2.33,(2.19%), +102,Eog Resources Inc,EOG,0.21104,130.56,0.75,(0.57%), +103,Becton Dickinson and Co,BDX,0.209627,262.6,3.8,(1.47%), +104,Micron Technology Inc,MU,0.208276,66.25,-1.96,(-2.87%), +105,American Tower Corp,AMT,0.207727,160.73,1.04,(0.65%), +106,Altria Group Inc,MO,0.207666,42.11,0.2,(0.47%), +107,T Mobile Us Inc,TMUS,0.20192,140.3,0.6,(0.43%), +108,Cme Group Inc,CME,0.201368,200.22,-0.14,(-0.07%), +109,Southern Co,SO,0.20116,65.04,-1.1,(-1.67%), +110,Palo Alto Networks Inc,PANW,0.198047,236.42,4.52,(1.95%), +111,Duke Energy Corp,DUK,0.193827,88.87,-1.23,(-1.36%), +112,Fiserv Inc,FI,0.192662,113.67,0.48,(0.42%), +113,Synopsys Inc,SNPS,0.189768,458.88,12.17,(2.72%), +114,Activision Blizzard Inc,ATVI,0.18717,93.71,-0.22,(-0.23%), +115,Aon Plc Class A,AON,0.186896,330.04,0.12,(0.04%), +116,Equinix Inc,EQIX,0.184757,715.84,8.74,(1.24%), +117,Illinois Tool Works,ITW,0.177501,233.17,0.77,(0.33%), +118,Air Products & Chemicals Inc,APD,0.17678,289.15,3.89,(1.36%), +119,Paypal Holdings Inc,PYPL,0.175802,58.3,0.96,(1.67%), +120,Cadence Design Sys Inc,CDNS,0.175052,235.09,4.44,(1.93%), +121,Northrop Grumman Corp,NOC,0.173654,441.3,4.06,(0.93%), +122,Intercontinental Exchange In,ICE,0.172998,109.93,1.66,(1.53%), +123,Humana Inc,HUM,0.170476,495.73,2.16,(0.44%), +124,Marathon Petroleum Corp,MPC,0.170186,155.28,2.85,(1.87%), +125,Kla Corp,KLAC,0.170079,459.61,14.05,(3.15%), +126,Fedex Corp,FDX,0.169747,266.99,4.28,(1.63%), +127,Csx Corp,CSX,0.169632,30.62,0.34,(1.14%), +128,Mckesson Corp,MCK,0.167376,445.58,1.2,(0.27%), +129,Sherwin Williams Co,SHW,0.165389,254.95,4.33,(1.73%), +130,Colgate Palmolive Co,CL,0.164,71.11,0.06,(0.08%), +131,Airbnb Inc Class A,ABNB,0.159553,137.66,3.63,(2.70%), +132,Waste Management Inc,WM,0.15893,154.17,-0.25,(-0.16%), +133,Emerson Electric Co,EMR,0.154857,97.31,0.45,(0.47%), +134,O Reilly Automotive Inc,ORLY,0.154194,918.15,3.98,(0.44%), +135,Pioneer Natural Resources Co,PXD,0.1524,234.43,0.34,(0.14%), +136,Phillips 66,PSX,0.150197,122.81,2.01,(1.66%), +137,Freeport Mcmoran Inc,FCX,0.146185,37.34,0.79,(2.17%), +138,3m Co W/d,MMM,0.144312,93.48,0.02,(0.02%), +139,Roper Technologies Inc,ROP,0.144165,486.61,-0.02,(-0.00%), +140,Valero Energy Corp,VLO,0.141937,147.59,3.64,(2.53%), +141,Nxp Semiconductors Nv,NXPI,0.141583,202.19,5.49,(2.79%), +142,Target Corp,TGT,0.141106,109.31,-0.44,(-0.40%), +143,Parker Hannifin Corp,PH,0.140358,396.29,5.18,(1.32%), +144,Us Bancorp,USB,0.139291,32.59,0.07,(0.20%), +145,General Dynamics Corp,GD,0.139193,223.44,2.44,(1.10%), +146,Chipotle Mexican Grill Inc,CMG,0.139055,1,828.59,22.51,(1.25%) +147,Hca Healthcare Inc,HCA,0.138966,251.59,4.33,(1.75%), +148,Arthur J Gallagher & Co,AJG,0.138231,231.77,1.44,(0.62%), +149,Moody S Corp,MCO,0.138162,319.07,4.56,(1.45%), +150,Amphenol Corp Cl A,APH,0.136941,84.4,2.04,(2.47%), +151,Ford Motor Co,F,0.1362,12.58,0.19,(1.49%), +152,Marriott International Cl A,MAR,0.135619,199.53,5.65,(2.92%), +153,Pnc Financial Services Group,PNC,0.135457,123.09,1.28,(1.05%), +154,Transdigm Group Inc,TDG,0.131273,860.46,8.64,(1.01%), +155,Carrier Global Corp,CARR,0.129065,56.83,1.75,(3.17%), +156,Autozone Inc,AZO,0.128857,2,556.17,15.27,(0.60%) +157,Trane Technologies Plc,TT,0.12759,207.07,7.01,(3.50%), +158,Motorola Solutions Inc,MSI,0.127284,275.18,2.2,(0.81%), +159,Arista Networks Inc,ANET,0.12715,184.23,2.63,(1.45%), +160,Norfolk Southern Corp,NSC,0.124378,197.3,1.08,(0.55%), +161,General Motors Co,GM,0.124282,33.25,0.9,(2.77%), +162,Paccar Inc,PCAR,0.123613,86.12,1.31,(1.54%), +163,Charter Communications Inc A,CHTR,0.123199,442.28,8.86,(2.04%), +164,Hess Corp,HES,0.121942,157.3,-0.74,(-0.47%), +165,Sempra,SRE,0.121909,68.15,-1.26,(-1.81%), +166,Occidental Petroleum Corp,OXY,0.121531,66.03,0.43,(0.66%), +167,American International Group,AIG,0.121272,61.73,0.72,(1.18%), +168,Autodesk Inc,ADSK,0.120711,208.03,5.75,(2.84%), +169,Edwards Lifesciences Corp,EW,0.119074,69.68,-0.43,(-0.62%), +170,Ecolab Inc,ECL,0.118911,169.5,1.63,(0.97%), +171,Public Storage,PSA,0.117206,266.58,1.6,(0.60%), +172,Microchip Technology Inc,MCHP,0.116275,78.91,2.41,(3.15%), +173,Aflac Inc,AFL,0.11627,77.65,0.62,(0.81%), +174,Cintas Corp,CTAS,0.116227,486.83,5.75,(1.19%), +175,Welltower Inc,WELL,0.116157,81.07,0.87,(1.08%), +176,Williams Cos Inc,WMB,0.115685,34.65,0.55,(1.61%), +177,Kimberly Clark Corp,KMB,0.114902,121.11,-0.55,(-0.45%), +178,Archer Daniels Midland Co,ADM,0.114307,76.74,0.38,(0.50%), +179,Msci Inc,MSCI,0.113047,518.97,7.03,(1.37%), +180,Constellation Brands Inc A,STZ,0.112869,251.62,1.03,(0.41%), +181,On Semiconductor,ON,0.111009,95.12,3.07,(3.33%), +182,Metlife Inc,MET,0.110772,63.06,0.26,(0.41%), +183,Monster Beverage Corp,MNST,0.110311,53.31,0.19,(0.35%), +184,Hilton Worldwide Holdings In,HLT,0.109054,153.24,3.88,(2.60%), +185,American Electric Power,AEP,0.108899,74.71,-1.15,(-1.51%), +186,Crown Castle Inc,CCI,0.108512,91.35,1.65,(1.83%), +187,Exelon Corp,EXC,0.107894,38.11,-0.69,(-1.78%), +188,Nucor Corp,NUE,0.107787,158.31,2.6,(1.67%), +189,Travelers Cos Inc,TRV,0.107342,167.42,-0.51,(-0.30%), +190,Dominion Energy Inc,D,0.106001,44.61,-0.86,(-1.88%), +191,Te Connectivity Ltd,TEL,0.105581,123.84,3.4,(2.82%), +192,Halliburton Co,HAL,0.105449,42.18,0.15,(0.37%), +193,Centene Corp,CNC,0.105443,69.87,0.13,(0.18%), +194,Fortinet Inc,FTNT,0.105315,59.07,0.93,(1.59%), +195,Oneok Inc,OKE,0.104854,64.86,0.35,(0.53%), +196,General Mills Inc,GIS,0.104655,63.79,-0.26,(-0.40%), +197,Copart Inc,CPRT,0.104453,43.66,0.61,(1.41%), +198,Paychex Inc,PAYX,0.104412,117.4,0.89,(0.76%), +199,Biogen Inc,BIIB,0.103916,258.95,1.43,(0.55%), +200,Truist Financial Corp,TFC,0.103679,28.15,0.18,(0.63%), +201,Ross Stores Inc,ROST,0.10361,111.18,2.26,(2.07%), +202,Johnson Controls Internation,JCI,0.103601,53.69,-0.85,(-1.55%), +203,Iqvia Holdings Inc,IQV,0.103397,200.11,-2.1,(-1.04%), +204,Capital One Financial Corp,COF,0.101688,96.63,1.14,(1.20%), +205,Baker Hughes Co,BKR,0.101425,36.62,0.37,(1.02%), +206,Idexx Laboratories Inc,IDXX,0.101263,439.37,2.51,(0.57%), +207,Corteva Inc,CTVA,0.100577,50.77,0.02,(0.05%), +208,Dow Inc,DOW,0.100258,50.87,-0.13,(-0.26%), +209,Old Dominion Freight Line,ODFL,0.100037,406.82,6.93,(1.73%), +210,Constellation Energy,CEG,0.099445,109.94,-0.81,(-0.73%), +211,Dexcom Inc,DXCM,0.099384,95.68,3.59,(3.90%), +212,Simon Property Group Inc,SPG,0.098977,108.45,0.26,(0.24%), +213,Digital Realty Trust Inc,DLR,0.098757,117.6,0.76,(0.65%), +214,Realty Income Corp,O,0.098278,49.83,0.17,(0.33%), +215,Kenvue Inc W/i,KVUE,0.097359,20.2,-0.02,(-0.12%), +216,Verisk Analytics Inc,VRSK,0.097203,241.97,2.34,(0.98%), +217,Cognizant Tech Solutions A,CTSH,0.096172,68.15,-0.05,(-0.07%), +218,P G & E Corp,PCG,0.095995,16.36,-0.09,(-0.52%), +219,Prudential Financial Inc,PRU,0.095804,94.93,0.41,(0.43%), +220,Ametek Inc,AME,0.09567,150.03,1.17,(0.79%), +221,Yum Brands Inc,YUM,0.095443,123.55,1.57,(1.29%), +222,Dupont De Nemours Inc,DD,0.094185,74.58,1.11,(1.51%), +223,Ameriprise Financial Inc,AMP,0.093691,332.11,5.16,(1.58%), +224,L3harris Technologies Inc,LHX,0.092512,173.16,-2.04,(-1.16%), +225,Fidelity National Info Serv,FIS,0.09207,56.06,0.52,(0.94%), +226,Sysco Corp,SYY,0.091968,65.99,0.78,(1.20%), +227,Moderna Inc,MRNA,0.091789,100.61,1.17,(1.18%), +228,Bank of New York Mellon Corp,BK,0.091699,42.76,0.59,(1.39%), +229,Agilent Technologies Inc,A,0.091382,111.91,1.41,(1.28%), +230,Otis Worldwide Corp,OTIS,0.091228,80.55,1.2,(1.51%), +231,Rockwell Automation Inc,ROK,0.091103,288.26,3.46,(1.21%), +232,Dr Horton Inc,DHI,0.090974,108.96,1.95,(1.82%), +233,Cummins Inc,CMI,0.090916,232.98,3.03,(1.32%), +234,Estee Lauder Companies Cl A,EL,0.090788,139.94,-0.1,(-0.07%), +235,Kinder Morgan Inc,KMI,0.090175,16.71,0.05,(0.27%), +236,Keurig Dr Pepper Inc,KDP,0.088358,31.51,-0.16,(-0.51%), +237,Fastenal Co,FAST,0.087952,55.72,0.66,(1.21%), +238,Xcel Energy Inc,XEL,0.087474,56.5,-0.71,(-1.25%), +239,Devon Energy Corp,DVN,0.087359,48.84,0,(0.01%), +240,Ww Grainger Inc,GWW,0.086956,704.07,3.96,(0.57%), +241,Costar Group Inc,CSGP,0.086756,77.1,0.75,(0.99%), +242,Cencora Inc,COR,0.086188,183.99,-1.17,(-0.63%), +243,United Rentals Inc,URI,0.085093,454.44,8.22,(1.84%), +244,Hershey Co,HSY,0.084755,201.01,-1.55,(-0.76%), +245,Arch Capital Group Ltd,ACGL,0.083799,81.62,0.54,(0.67%), +246,Ppg Industries Inc,PPG,0.083787,130.49,2.46,(1.92%), +247,Global Payments Inc,GPN,0.083671,116.72,1.47,(1.28%), +248,Consolidated Edison Inc,ED,0.083432,85.06,-1.57,(-1.81%), +249,Newmont Corp,NEM,0.082799,36.78,-0.5,(-1.34%), +250,Republic Services Inc,RSG,0.082765,145.01,0.28,(0.19%), +251,Allstate Corp,ALL,0.08254,112.77,-0.25,(-0.22%), +252,Electronic Arts Inc,EA,0.081213,119.76,1.79,(1.51%), +253,Vici Properties Inc,VICI,0.081127,29.28,0.4,(1.37%), +254,Kroger Co,KR,0.080998,44.96,0.48,(1.07%), +255,Public Service Enterprise Gp,PEG,0.080723,56.88,-1.02,(-1.75%), +256,Lennar Corp A,LEN,0.078759,113.41,1.71,(1.53%), +257,Diamondback Energy Inc,FANG,0.078498,158.01,0.78,(0.50%), +258,West Pharmaceutical Services,WST,0.077362,377.15,1.97,(0.52%), +259,Quanta Services Inc,PWR,0.077074,190.82,0.7,(0.37%), +260,Gartner Inc,IT,0.076911,347.78,-1.41,(-0.40%), +261,Aptiv Plc,APTV,0.0757,99.21,3.35,(3.50%), +262,Vulcan Materials Co,VMC,0.075604,207.6,4,(1.97%), +263,Kraft Heinz Co,KHC,0.075468,33.72,-0.31,(-0.90%), +264,Ge Healthcare Technology,GEHC,0.074734,69.81,1.53,(2.24%), +265,Cdw Corp/de,CDW,0.074375,202.53,3.84,(1.93%), +266,Fortive Corp,FTV,0.072323,74.75,1.16,(1.58%), +267,Ingersoll Rand Inc,IR,0.071683,64.52,1.25,(1.97%), +268,Ansys Inc,ANSS,0.071343,299.19,4.85,(1.65%), +269,Extra Space Storage Inc,EXR,0.071269,120.75,0.24,(0.20%), +270,Wec Energy Group Inc,WEC,0.071007,79.67,-0.91,(-1.12%), +271,Martin Marietta Materials,MLM,0.070759,418,8.05,(1.96%), +272,Edison International,EIX,0.068887,63.92,-1.38,(-2.11%), +273,American Water Works Co Inc,AWK,0.068233,123.27,-3.07,(-2.43%), +274,Warner Bros Discovery Inc,WBD,0.068207,10.89,-0.15,(-1.31%), +275,Lyondellbasell Indu Cl A,LYB,0.067294,94.86,-0.11,(-0.11%), +276,Mettler Toledo International,MTD,0.067028,1,112.26,14.48,(1.32%) +277,Avalonbay Communities Inc,AVB,0.066762,171.85,-0.6,(-0.35%), +278,Delta Air Lines Inc,DAL,0.065781,37.32,0.66,(1.79%), +279,T Rowe Price Group Inc,TROW,0.064996,104.73,1.19,(1.15%), +280,Keysight Technologies In,KEYS,0.064934,133.51,3.11,(2.38%), +281,Zimmer Biomet Holdings Inc,ZBH,0.064476,112.14,1.38,(1.24%), +282,Dollar General Corp,DG,0.064042,105.04,0.7,(0.67%), +283,Corning Inc,GLW,0.064037,30.35,0.29,(0.98%), +284,Ebay Inc,EBAY,0.063728,43.45,0.56,(1.31%), +285,Cbre Group Inc A,CBRE,0.063578,73.84,0.35,(0.48%), +286,Weyerhaeuser Co,WY,0.063312,30.4,-0.64,(-2.05%), +287,Church & Dwight Co Inc,CHD,0.062765,91.68,-0.29,(-0.31%), +288,Cardinal Health Inc,CAH,0.062583,88.18,0.14,(0.16%), +289,Hp Inc,HPQ,0.062013,25.73,0.09,(0.36%), +290,Equifax Inc,EFX,0.061821,185.4,4.68,(2.59%), +291,Tractor Supply Company,TSCO,0.061683,205.07,2.06,(1.02%), +292,Willis Towers Watson Plc,WTW,0.06168,211.96,0.35,(0.17%), +293,Hewlett Packard Enterprise,HPE,0.061499,17.7,0.63,(3.66%), +294,Fair Isaac Corp,FICO,0.061481,890.19,4.58,(0.52%), +295,Dollar Tree Inc,DLTR,0.061287,106.46,1.11,(1.05%), +296,Hartford Financial Svcs Grp,HIG,0.061236,72.24,0.53,(0.73%), +297,Resmed Inc,RMD,0.060853,149.81,1.16,(0.78%), +298,Take Two Interactive Softwre,TTWO,0.060753,139.63,1.85,(1.34%), +299,Royal Caribbean Cruises Ltd,RCL,0.060515,94.38,2.42,(2.64%), +300,Xylem Inc,XYL,0.060192,91.4,1.09,(1.20%), +301,Align Technology Inc,ALGN,0.060095,309.06,7.38,(2.45%), +302,Steris Plc,STE,0.060013,221.57,3.67,(1.69%), +303,Broadridge Financial Solutio,BR,0.059572,181.18,-0.04,(-0.02%), +304,Discover Financial Services,DFS,0.059507,86.35,1.09,(1.28%), +305,State Street Corp,STT,0.059411,67.81,1.03,(1.54%), +306,Sba Communications Corp,SBAC,0.059216,198.11,2.05,(1.05%), +307,Monolithic Power Systems Inc,MPWR,0.058699,457.69,16.51,(3.74%), +308,Illumina Inc,ILMN,0.058584,133.02,-0.28,(-0.21%), +309,Dte Energy Company,DTE,0.058057,98.82,-1.72,(-1.71%), +310,M & T Bank Corp,MTB,0.057846,126.63,2.09,(1.68%), +311,Coterra Energy Inc,CTRA,0.057589,27.48,0.34,(1.23%), +312,Eversource Energy,ES,0.057281,57.54,-1.23,(-2.09%), +313,Genuine Parts Co,GPC,0.055796,142.94,0.63,(0.45%), +314,Equity Residential,EQR,0.055712,58.67,0.23,(0.40%), +315,Entergy Corp,ETR,0.055241,92.23,-1.02,(-1.10%), +316,Dover Corp,DOV,0.055103,141.68,1.09,(0.77%), +317,Ameren Corporation,AEE,0.054981,74.6,-1.51,(-1.98%), +318,Ulta Beauty Inc,ULTA,0.054585,398.17,5.73,(1.46%), +319,Teledyne Technologies Inc,TDY,0.054228,414.36,0.92,(0.22%), +320,Nvr Inc,NVR,0.054188,6,27.42,86.42,(1.45%) +321,Targa Resources Corp,TRGP,0.05408,87.52,0.93,(1.08%), +322,Molina Healthcare Inc,MOH,0.053618,333.09,2.03,(0.61%), +323,Wabtec Corp,WAB,0.053425,108.18,1.35,(1.26%), +324,Fleetcor Technologies Inc,FLT,0.053345,260.14,1.28,(0.49%), +325,Albemarle Corp,ALB,0.053229,172.99,10.36,(6.37%), +326,Baxter International Inc,BAX,0.05272,37.54,0.21,(0.57%), +327,Raymond James Financial Inc,RJF,0.052247,101.39,1.84,(1.85%), +328,Mccormick & Co Non Vtg Shrs,MKC,0.051871,74.55,0.46,(0.63%), +329,Invitation Homes Inc,INVH,0.051153,31.73,0.03,(0.11%), +330,Firstenergy Corp,FE,0.050777,34.56,-0.69,(-1.94%), +331,Laboratory Crp of Amer Hldgs,LH,0.05072,204.23,-0.62,(-0.30%), +332,Howmet Aerospace Inc,HWM,0.050386,46.99,0.91,(1.97%), +333,Verisign Inc,VRSN,0.050215,202.93,2.46,(1.23%), +334,Ppl Corp,PPL,0.04902,23.56,-0.39,(-1.61%), +335,Iron Mountain Inc,IRM,0.047985,59.55,0.56,(0.94%), +336,Jacobs Solutions Inc,J,0.047882,136.45,0.27,(0.20%), +337,Intl Flavors & Fragrances,IFF,0.047868,67.84,0.64,(0.95%), +338,Centerpoint Energy Inc,CNP,0.047827,26.68,-0.48,(-1.75%), +339,Darden Restaurants Inc,DRI,0.047736,143.44,2.01,(1.42%), +340,Hologic Inc,HOLX,0.047358,69.99,0.75,(1.08%), +341,First Solar Inc,FSLR,0.047324,161.9,3.29,(2.07%), +342,Expeditors Intl Wash Inc,EXPD,0.046936,114.74,1.08,(0.95%), +343,Brown & Brown Inc,BRO,0.046675,71.15,0.19,(0.26%), +344,Factset Research Systems Inc,FDS,0.046601,443.66,8.47,(1.95%), +345,Fifth Third Bancorp,FITB,0.046598,25.05,0.19,(0.74%), +346,Ventas Inc,VTR,0.046351,42.18,0.77,(1.85%), +347,Marathon Oil Corp,MRO,0.046321,27.51,0.12,(0.45%), +348,Steel Dynamics Inc,STLD,0.046096,106.96,0.52,(0.48%), +349,Bunge Ltd,BG,0.046038,110.67,1.1,(1.00%), +350,Ptc Inc,PTC,0.045951,140.25,1.78,(1.28%), +351,Everest Group Ltd,EG,0.04587,381.3,-0.42,(-0.11%), +352,Cincinnati Financial Corp,CINF,0.045852,104.4,-0.3,(-0.29%), +353,Enphase Energy Inc,ENPH,0.045679,121.39,1.28,(1.07%), +354,Nasdaq Inc,NDAQ,0.04562,49.07,0.74,(1.52%), +355,Akamai Technologies Inc,AKAM,0.045578,107.75,0.79,(0.74%), +356,Cboe Global Markets Inc,CBOE,0.045525,155.28,0.51,(0.33%), +357,Cf Industries Holdings Inc,CF,0.04496,84.93,1.48,(1.78%), +358,Waters Corp,WAT,0.044936,274.46,2.12,(0.78%), +359,Pultegroup Inc,PHM,0.044848,74.85,1.65,(2.25%), +360,Tyler Technologies Inc,TYL,0.044831,387.74,2.43,(0.63%), +361,Principal Financial Group,PFG,0.044705,72.74,0.74,(1.02%), +362,Clorox Company,CLX,0.04465,128.98,-0.17,(-0.13%), +363,Southwest Airlines Co,LUV,0.044478,27.3,0.49,(1.81%), +364,Regions Financial Corp,RF,0.044397,17.16,0.22,(1.27%), +365,Garmin Ltd,GRMN,0.044336,104.65,1.42,(1.38%), +366,Atmos Energy Corp,ATO,0.044128,106.32,-0.14,(-0.13%), +367,Netapp Inc,NTAP,0.044116,76.49,1.54,(2.05%), +368,Textron Inc,TXT,0.043659,79.27,0.33,(0.41%), +369,Cooper Cos Inc,COO,0.04361,318.15,2.23,(0.71%), +370,Kellogg Co,K,0.043517,58.9,-0.22,(-0.38%), +371,Idex Corp,IEX,0.043484,210.72,3.28,(1.58%), +372,Cms Energy Corp,CMS,0.043476,52.78,-0.57,(-1.07%), +373,Skyworks Solutions Inc,SWKS,0.042974,98.55,2.25,(2.33%), +374,Alexandria Real Estate Equit,ARE,0.042466,99.48,0.59,(0.60%), +375,Hunt (Jb) Transprt Svcs Inc,JBHT,0.042319,186.54,0.95,(0.51%), +376,Las Vegas Sands Corp,LVS,0.042222,45.63,-0.53,(-1.15%), +377,Ball Corp,BALL,0.042202,48.27,0.04,(0.08%), +378,Walgreens Boots Alliance Inc,WBA,0.04215,20.97,-0.06,(-0.26%), +379,Teradyne Inc,TER,0.041494,100.04,3.56,(3.68%), +380,Mid America Apartment Comm,MAA,0.041385,128.55,0.48,(0.37%), +381,Epam Systems Inc,EPAM,0.041006,257.76,0.96,(0.37%), +382,Avery Dennison Corp,AVY,0.040961,183.42,1.39,(0.76%), +383,Omnicom Group,OMC,0.040483,74.6,1.21,(1.65%), +384,Huntington Bancshares Inc,HBAN,0.040444,10.25,0.13,(1.24%), +385,Eqt Corp,EQT,0.040251,40,0.39,(0.99%), +386,Tyson Foods Inc Cl A,TSN,0.040042,49.74,-0.37,(-0.74%), +387,Western Digital Corp,WDC,0.039814,45.5,0.94,(2.11%), +388,Northern Trust Corp,NTRS,0.039557,69.29,0.84,(1.23%), +389,Carnival Corp,CCL,0.039206,14.52,0.54,(3.88%), +390,Expedia Group Inc,EXPE,0.038585,102.75,2.5,(2.49%), +391,United Airlines Holdings Inc,UAL,0.038383,42.84,0.81,(1.94%), +392,Quest Diagnostics Inc,DGX,0.038331,123.71,0.31,(0.25%), +393,Axon Enterprise Inc,AXON,0.03828,195.69,1.04,(0.53%), +394,Packaging Corp of America,PKG,0.038236,152.79,0.9,(0.59%), +395,Revvity Inc,RVTY,0.0378,110.55,1.5,(1.38%), +396,Snap on Inc,SNA,0.037774,257.97,4,(1.58%), +397,Pool Corp,POOL,0.037475,353.56,9.86,(2.87%), +398,Essex Property Trust Inc,ESS,0.03733,210.81,0.07,(0.03%), +399,Domino S Pizza Inc,DPZ,0.037258,382.39,2.18,(0.57%), +400,Amcor Plc,AMCR,0.037101,9.09,0.06,(0.61%), +401,Best Buy Co Inc,BBY,0.037071,68.66,0.29,(0.43%), +402,Apa Corp,APA,0.03662,42.49,0.11,(0.27%), +403,Lamb Weston Holdings Inc,LW,0.036553,91.47,0.09,(0.10%), +404,Wr Berkley Corp,WRB,0.036551,65.21,0.86,(1.33%), +405,Conagra Brands Inc,CAG,0.036484,27.44,-0.1,(-0.35%), +406,Lkq Corp,LKQ,0.036449,49.51,0.72,(1.47%), +407,Jm Smucker Co,SJM,0.035767,124.48,-0.96,(-0.77%), +408,Stanley Black & Decker Inc,SWK,0.035567,83.87,0.97,(1.17%), +409,Synchrony Financial,SYF,0.035241,30.73,0.55,(1.84%), +410,Carmax Inc,KMX,0.035202,71.64,-8.05,(-10.10%), +411,Leidos Holdings Inc,LDOS,0.034943,92.2,0.21,(0.23%), +412,Seagate Technology Holdings,STX,0.034918,65.71,1.42,(2.20%), +413,Paycom Software Inc,PAYC,0.034914,259.42,2.34,(0.91%), +414,Celanese Corp,CE,0.034212,127.11,3.81,(3.09%), +415,Trimble Inc,TRMB,0.034136,52.22,3.01,(6.12%), +416,Alliant Energy Corp,LNT,0.03411,48.06,-0.49,(-1.02%), +417,Citizens Financial Group,CFG,0.033972,26.28,0.52,(2.00%), +418,International Paper Co,IP,0.033961,35.1,0.15,(0.41%), +419,Masco Corp,MAS,0.033414,54.58,1.37,(2.58%), +420,Nordson Corp,NDSN,0.033057,223.81,3.73,(1.69%), +421,Loews Corp,L,0.032942,64.16,0.36,(0.56%), +422,Evergy Inc,EVRG,0.032792,50.48,-0.58,(-1.13%), +423,Mosaic Co,MOS,0.03266,35.63,0.43,(1.22%), +424,Molson Coors Beverage Co B,TAP,0.032624,62.29,-0.12,(-0.19%), +425,Zebra Technologies Corp Cl A,ZBRA,0.03257,236.95,11.04,(4.89%), +426,Viatris Inc,VTRS,0.032115,9.8,0.21,(2.14%), +427,Live Nation Entertainment In,LYV,0.032035,83.73,2.71,(3.34%), +428,Host Hotels & Resorts Inc,HST,0.03173,16.38,0.34,(2.11%), +429,Insulet Corp,PODD,0.031493,166.19,4.49,(2.77%), +430,Match Group Inc,MTCH,0.031269,40.07,0.09,(0.23%), +431,Interpublic Group of Cos Inc,IPG,0.031184,29.12,0.39,(1.35%), +432,Hormel Foods Corp,HRL,0.030887,38.15,-0.19,(-0.48%), +433,Incyte Corp,INCY,0.03067,58.93,-0.18,(-0.30%), +434,Udr Inc,UDR,0.030252,35.67,0.28,(0.79%), +435,Jack Henry & Associates Inc,JKHY,0.030211,150.61,2.17,(1.46%), +436,Kimco Realty Corp,KIM,0.029862,17.73,0.24,(1.34%), +437,Aes Corp,AES,0.029775,15.29,-0.65,(-4.05%), +438,Bio Techne Corp,TECH,0.029742,67.67,0.1,(0.15%), +439,Pentair Plc,PNR,0.029592,65.59,0.87,(1.34%), +440,Rollins Inc,ROL,0.029276,37.64,0.2,(0.52%), +441,Mgm Resorts International,MGM,0.028601,36.76,0.27,(0.74%), +442,Ceridian Hcm Holding Inc,CDAY,0.028589,67.38,0.35,(0.52%), +443,Brown Forman Corp Class B,BF.B,0.028542,56.78,0.14,(0.25%), +444,Nisource Inc,NI,0.028365,24.84,-0.35,(-1.37%), +445,Gen Digital Inc,GEN,0.028124,17.83,-0.07,(-0.37%), +446,C.H. Robinson Worldwide Inc,CHRW,0.028048,86.31,0.02,(0.02%), +447,Camden Property Trust,CPT,0.027984,94.56,-0.32,(-0.34%), +448,Charles River Laboratories,CRL,0.027736,195.69,0.75,(0.38%), +449,Healthpeak Properties Inc,PEAK,0.027617,18.15,0.1,(0.58%), +450,Caesars Entertainment Inc,CZR,0.027217,47.52,1.54,(3.36%), +451,Regency Centers Corp,REG,0.027131,59.98,0.85,(1.43%), +452,Keycorp,KEY,0.0269,10.52,0.22,(2.09%), +453,Henry Schein Inc,HSIC,0.026715,73.88,0.62,(0.84%), +454,Globe Life Inc,GL,0.026574,110.04,0.61,(0.56%), +455,Borgwarner Inc,BWA,0.026416,40.72,0.92,(2.31%), +456,F5 Inc,FFIV,0.026087,160.33,2.74,(1.74%), +457,Qorvo Inc,QRVO,0.025849,96.39,1.83,(1.93%), +458,Teleflex Inc,TFX,0.025796,199.42,2.91,(1.48%), +459,Allegion Plc,ALLE,0.025545,104.97,1.68,(1.63%), +460,Westrock Co,WRK,0.025292,35.98,0.23,(0.64%), +461,Eastman Chemical Co,EMN,0.025003,76.99,2.35,(3.15%), +462,Wynn Resorts Ltd,WYNN,0.024938,92.21,0,(-0.00%), +463,Nrg Energy Inc,NRG,0.024681,38.55,-0.03,(-0.08%), +464,Juniper Networks Inc,JNPR,0.024655,27.92,0.42,(1.52%), +465,Pinnacle West Capital,PNW,0.02321,73.45,-0.71,(-0.95%), +466,Hasbro Inc,HAS,0.02308,65.23,0.24,(0.37%), +467,Catalent Inc,CTLT,0.023069,45.85,0.07,(0.15%), +468,American Airlines Group Inc,AAL,0.02296,13,0.39,(3.05%), +469,Fmc Corp,FMC,0.022942,66.03,0.02,(0.03%), +470,Campbell Soup Co,CPB,0.022776,41.15,-0.31,(-0.76%), +471,Smith (a.O.) Corp,AOS,0.022769,66.99,1.54,(2.35%), +472,Boston Properties Inc,BXP,0.02269,59.66,0.79,(1.34%), +473,Huntington Ingalls Industrie,HII,0.022502,204.41,1.22,(0.60%), +474,Fox Corp Class A,FOXA,0.021902,31.47,0.55,(1.76%), +475,Robert Half Inc,RHI,0.021872,73.78,0.64,(0.87%), +476,Assurant Inc,AIZ,0.021618,145.63,-0.13,(-0.09%), +477,Universal Health Services B,UHS,0.021551,127,2.8,(2.25%), +478,Etsy Inc,ETSY,0.021257,63.53,1.64,(2.65%), +479,Marketaxess Holdings Inc,MKTX,0.021132,205.89,4.11,(2.04%), +480,News Corp Class A,NWSA,0.0209,20,0.35,(1.76%), +481,Bio Rad Laboratories A,BIO,0.020548,356.1,3.63,(1.03%), +482,Bath & Body Works Inc,BBWI,0.020412,33.19,1.04,(3.23%), +483,Dentsply Sirona Inc,XRAY,0.020079,33.94,-0.17,(-0.51%), +484,Solaredge Technologies Inc,SEDG,0.020026,132.35,4.34,(3.39%), +485,Whirlpool Corp,WHR,0.019812,131.66,1.03,(0.79%), +486,Franklin Resources Inc,BEN,0.019128,24.55,0.28,(1.14%), +487,Generac Holdings Inc,GNRC,0.018958,110.73,1.84,(1.69%), +488,Norwegian Cruise Line Holdin,NCLH,0.018812,16.96,0.67,(4.08%), +489,Federal Realty Invs Trust,FRT,0.018475,91.45,1.05,(1.16%), +490,Tapestry Inc,TPR,0.01809,28.18,0.23,(0.84%), +491,Invesco Ltd,IVZ,0.017835,14.31,0.22,(1.53%), +492,Paramount Global Class B,PARA,0.017208,12.89,0.11,(0.89%), +493,Vf Corp,VFC,0.015631,16.59,-0.32,(-1.89%), +494,Comerica Inc,CMA,0.014638,41.07,1.12,(2.81%), +495,Davita Inc,DVA,0.014395,95.75,0.01,(0.01%), +496,Zions Bancorp Na,ZION,0.013918,33.96,0.79,(2.39%), +497,Ralph Lauren Corp,RL,0.013127,115.52,0.26,(0.22%), +498,Sealed Air Corp,SEE,0.012794,32.2,0.46,(1.46%), +499,Alaska Air Group Inc,ALK,0.012574,37.04,0.63,(1.73%), +500,Mohawk Industries Inc,MHK,0.011998,85.15,1.23,(1.46%), +501,Organon & Co,OGN,0.011665,16.93,0.34,(2.02%), +502,Dxc Technology Co,DXC,0.011658,20.64,0.29,(1.40%), +503,Fox Corp Class B,FOX,0.010545,29.16,0.53,(1.85%), +504,News Corp Class B,NWS,0.006575,20.75,0.36,(1.74%), diff --git a/vuu/src/main/scala/org/finos/vuu/SimulMain.scala b/example/main/src/main/scala/org/finos/vuu/SimulMain.scala similarity index 94% rename from vuu/src/main/scala/org/finos/vuu/SimulMain.scala rename to example/main/src/main/scala/org/finos/vuu/SimulMain.scala index dbc666160..f8538e78a 100644 --- a/vuu/src/main/scala/org/finos/vuu/SimulMain.scala +++ b/example/main/src/main/scala/org/finos/vuu/SimulMain.scala @@ -2,24 +2,24 @@ package org.finos.vuu import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.StrictLogging -import org.finos.vuu.core.module.authn.AuthNModule -import org.finos.vuu.core.module.metrics.MetricsModule -import org.finos.vuu.core.module.simul.SimulationModule -import org.finos.vuu.core.module.typeahead.TypeAheadModule -import org.finos.vuu.core.module.vui.VuiStateModule -import org.finos.vuu.core.{VuuSecurityOptions, VuuServer, VuuServerConfig, VuuThreadingOptions, VuuWebSocketOptions} -import org.finos.vuu.net.{AlwaysHappyLoginValidator, Authenticator, LoggedInTokenValidator} -import org.finos.vuu.net.auth.AlwaysHappyAuthenticator -import org.finos.vuu.net.http.VuuHttp2ServerOptions -import org.finos.vuu.state.{MemoryBackedVuiStateStore, VuiHeader, VuiJsonState, VuiState} import org.finos.toolbox.jmx.{JmxInfra, MetricsProvider, MetricsProviderImpl} import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.time.{Clock, DefaultClock} +import org.finos.vuu.core._ import org.finos.vuu.core.module.TableDefContainer +import org.finos.vuu.core.module.authn.AuthNModule import org.finos.vuu.core.module.auths.PermissionModule import org.finos.vuu.core.module.basket.BasketModule import org.finos.vuu.core.module.editable.EditableModule +import org.finos.vuu.core.module.metrics.MetricsModule import org.finos.vuu.core.module.price.PriceModule +import org.finos.vuu.core.module.simul.SimulationModule +import org.finos.vuu.core.module.typeahead.TypeAheadModule +import org.finos.vuu.core.module.vui.VuiStateModule +import org.finos.vuu.net.auth.AlwaysHappyAuthenticator +import org.finos.vuu.net.http.VuuHttp2ServerOptions +import org.finos.vuu.net.{AlwaysHappyLoginValidator, Authenticator, LoggedInTokenValidator} +import org.finos.vuu.state.MemoryBackedVuiStateStore /* //to allow self signed certs diff --git a/example/order/pom.xml b/example/order/pom.xml new file mode 100644 index 000000000..89342d707 --- /dev/null +++ b/example/order/pom.xml @@ -0,0 +1,265 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + + order + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + permission + 0.5.09-SNAPSHOT + + + + org.finos.vuu + price + 0.5.09-SNAPSHOT + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala similarity index 91% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala index 7719a3e2d..2c4f66d38 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala +++ b/example/order/src/main/scala/org/finos/vuu/core/module/simul/SimulationModule.scala @@ -1,47 +1,22 @@ package org.finos.vuu.core.module.simul import com.typesafe.scalalogging.StrictLogging +import org.finos.toolbox.lifecycle.{DefaultLifecycleEnabled, LifecycleContainer} +import org.finos.toolbox.time.Clock import org.finos.vuu.api._ import org.finos.vuu.client.messages.RequestId +import org.finos.vuu.core.module.auths.OrderPermissionChecker +import org.finos.vuu.core.module.price.PriceModule import org.finos.vuu.core.module.simul.provider._ +import org.finos.vuu.core.module.simul.service.ParentOrdersService import org.finos.vuu.core.module.{DefaultModule, ModuleFactory, TableDefContainer, ViewServerModule} import org.finos.vuu.core.table.{Columns, DataTable, TableContainer} import org.finos.vuu.net.rpc.RpcHandler import org.finos.vuu.net.{ClientSessionId, RequestContext} -import org.finos.vuu.provider.simulation.{SimulatedBigInstrumentsProvider, SimulatedPricesProvider} -import org.finos.vuu.provider.{Provider, ProviderContainer, RpcProvider} +import org.finos.vuu.provider.simulation.SimulatedBigInstrumentsProvider +import org.finos.vuu.provider.{ProviderContainer, RpcProvider} import org.finos.vuu.viewport._ -import org.finos.toolbox.lifecycle.{DefaultLifecycleEnabled, LifecycleContainer} -import org.finos.toolbox.time.Clock -import org.finos.vuu.core.module.auths.OrderPermissionChecker -import org.finos.vuu.core.module.price.PriceModule -import org.finos.vuu.core.module.simul.service.ParentOrdersService - -class PricesService(val table: DataTable, val provider: Provider) extends RpcHandler with StrictLogging { - - private val pricesProvider = provider.asInstanceOf[SimulatedPricesProvider] - def setSpeedSlow(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { - pricesProvider.setSpeed(8000) - NoAction() - } - - def setSpeedMedium(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { - pricesProvider.setSpeed(2000) - NoAction() - } - - def setSpeedFast(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { - pricesProvider.setSpeed(400) - NoAction() - } - - override def menuItems(): ViewPortMenu = ViewPortMenu("Root", - new SelectionViewPortMenuItem("Set Slow", "", this.setSpeedSlow, "SET_SPEED_SLOW"), - new SelectionViewPortMenuItem("Set Medium", "", this.setSpeedMedium, "SET_SPEED_MED"), - new SelectionViewPortMenuItem("Set Fast", "", this.setSpeedFast, "SET_SPEED_FAST") - ) -} class InstrumentsService(val table: DataTable, val providerContainer: ProviderContainer) extends RpcHandler with StrictLogging { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala index 940b01b1c..475ca1fdf 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ChildOrdersProvider.scala @@ -1,9 +1,9 @@ package org.finos.vuu.core.module.simul.provider -import org.finos.vuu.core.table.{DataTable, RowWithData} -import org.finos.vuu.provider.Provider import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider class ChildOrdersProvider(val table: DataTable, model: ParentChildOrdersModel)(implicit clock: Clock, lifecycleContainer: LifecycleContainer) extends Provider { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala index 8075f09f4..75ec1dd1c 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/OrdersSimulProvider.scala @@ -1,10 +1,10 @@ package org.finos.vuu.core.module.simul.provider -import org.finos.vuu.core.table.{DataTable, RowWithData} -import org.finos.vuu.provider.Provider import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.thread.LifeCycleRunner import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider import java.util import java.util.Random diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentChildOrdersModel.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentChildOrdersModel.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentChildOrdersModel.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentChildOrdersModel.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala index 082fd554f..9f3af7707 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/ParentOrdersProvider.scala @@ -1,10 +1,10 @@ package org.finos.vuu.core.module.simul.provider -import org.finos.vuu.core.table.{DataTable, RowWithData} -import org.finos.vuu.provider.Provider import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.thread.LifeCycleRunner import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider class ParentOrdersProvider(val table: DataTable, val model: ParentChildOrdersModel)(implicit clock: Clock, lifecycleContainer: LifecycleContainer) extends Provider { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/PermissionedOrdersProvider.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/PermissionedOrdersProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/provider/PermissionedOrdersProvider.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/provider/PermissionedOrdersProvider.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala b/example/order/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala similarity index 95% rename from vuu/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala rename to example/order/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala index 0b775f2d2..b2ad3c11d 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala +++ b/example/order/src/main/scala/org/finos/vuu/core/module/simul/service/ParentOrdersService.scala @@ -6,7 +6,7 @@ import org.finos.vuu.core.table.DataTable import org.finos.vuu.net.ClientSessionId import org.finos.vuu.net.rpc.RpcHandler import org.finos.vuu.provider.Provider -import org.finos.vuu.viewport.{NoAction, SelectionViewPortMenuItem, ViewPortAction, ViewPortMenu, ViewPortSelection} +import org.finos.vuu.viewport._ class ParentOrdersService(val table: DataTable, val provider: Provider) extends RpcHandler with StrictLogging { diff --git a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala rename to example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala index 53516ac55..d2929eb0f 100644 --- a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedBigInstrumentsProvider.scala @@ -1,12 +1,12 @@ package org.finos.vuu.provider.simulation import com.typesafe.scalalogging.StrictLogging -import org.finos.vuu.core.table.{DataTable, RowWithData} -import org.finos.vuu.provider.Provider import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.logging.LogAtFrequency import org.finos.toolbox.thread.RunOnceLifeCycleRunner import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider import scala.concurrent.duration.DurationInt import scala.util.Random diff --git a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala rename to example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala index f39e77168..e203d4dd2 100644 --- a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedInstrumentProvider.scala @@ -1,9 +1,9 @@ package org.finos.vuu.provider.simulation import com.typesafe.scalalogging.StrictLogging +import org.finos.toolbox.time.Clock import org.finos.vuu.core.table.{DataTable, RowWithData} import org.finos.vuu.provider.Provider -import org.finos.toolbox.time.Clock class SimulatedInstrumentProvider(instruments: Array[Array[String]], table: DataTable)(implicit timeProvider: Clock) extends Provider with StrictLogging { diff --git a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala rename to example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala index fbe01b429..c7d824eda 100644 --- a/vuu/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala +++ b/example/order/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala @@ -1,12 +1,12 @@ package org.finos.vuu.provider.simulation import com.typesafe.scalalogging.StrictLogging -import org.finos.vuu.core.table.{DataTable, RowWithData} -import org.finos.vuu.provider.Provider import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.logging.LogAtFrequency import org.finos.toolbox.thread.{LifeCycleRunner, RunInThread} import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider import java.util.Random import java.util.concurrent.ConcurrentHashMap diff --git a/example/permission/pom.xml b/example/permission/pom.xml new file mode 100644 index 000000000..c28f99055 --- /dev/null +++ b/example/permission/pom.xml @@ -0,0 +1,262 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + + permission + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + tests + test-jar + test + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala index 0a7233b8d..2af9d7ff2 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNModule.scala @@ -1,9 +1,9 @@ package org.finos.vuu.core.module.authn -import org.finos.vuu.core.module.{DefaultModule, ModuleFactory, TableDefContainer, ViewServerModule} -import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator} import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.time.Clock +import org.finos.vuu.core.module.{DefaultModule, ModuleFactory, TableDefContainer, ViewServerModule} +import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator} object AuthNModule extends DefaultModule { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala index 9a3fc4575..b6c785575 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/AuthNRestService.scala @@ -1,11 +1,11 @@ package org.finos.vuu.core.module.authn import com.typesafe.scalalogging.StrictLogging -import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator, ServerUserPrincipal} -import org.finos.vuu.net.rest.RestService import io.vertx.core.http.Cookie import io.vertx.ext.web.RoutingContext import org.finos.toolbox.time.Clock +import org.finos.vuu.net.rest.RestService +import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator, ServerUserPrincipal} import java.util.concurrent.TimeUnit import scala.util.{Failure, Success, Try} diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala similarity index 92% rename from vuu/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala index 7187ebcc2..e8b8350f2 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/authn/VuuAuthHandler.scala @@ -1,3 +1,5 @@ +package org.finos.vuu.core.module.authn + //package org.finos.vuu.core.module.authn // //import io.vertx.core.{AsyncResult, Handler} diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala similarity index 90% rename from vuu/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala index 4d30f79fb..42c33d4a6 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/OrderPermissionChecker.scala @@ -3,11 +3,9 @@ package org.finos.vuu.core.module.auths import org.finos.toolbox.lifecycle.{DefaultLifecycleEnabled, LifecycleContainer} import org.finos.toolbox.thread.LifeCycleRunner import org.finos.toolbox.time.Clock -import org.finos.vuu.core.VuuServer import org.finos.vuu.core.auths.RowPermissionChecker import org.finos.vuu.core.module.auths.PermissionModule.ColumnNames.Bitmask -import org.finos.vuu.core.sort.UserDefinedFilterAndSort -import org.finos.vuu.core.table.{DataTable, RowData, RowWithData, TableContainer} +import org.finos.vuu.core.table.{RowData, RowWithData, TableContainer} import org.finos.vuu.viewport.ViewPort class OrderPermissionChecker(val vp: ViewPort, tableContainer: TableContainer)(implicit lifecycle: LifecycleContainer, clock: Clock) extends DefaultLifecycleEnabled with RowPermissionChecker { diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/auths/PermissionModule.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/PermissionModule.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/auths/PermissionModule.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/auths/PermissionModule.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala similarity index 99% rename from vuu/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala index 7d82230f9..c7951617e 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/PermissionSet.scala @@ -29,7 +29,6 @@ object PermissionSet { roles.mkString(",") } - def toBinaryString(intRepresentation: Int): String = { val binaryString = Integer.toBinaryString(intRepresentation) padWithZeros(binaryString) diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/auths/provider/PermissionsProvider.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/provider/PermissionsProvider.scala similarity index 100% rename from vuu/src/main/scala/org/finos/vuu/core/module/auths/provider/PermissionsProvider.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/auths/provider/PermissionsProvider.scala diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala similarity index 93% rename from vuu/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala rename to example/permission/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala index 583bcc78f..8ca4f71ba 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala +++ b/example/permission/src/main/scala/org/finos/vuu/core/module/auths/service/PermissionsRpcService.scala @@ -2,13 +2,13 @@ package org.finos.vuu.core.module.auths.service import com.typesafe.scalalogging.StrictLogging import org.finos.toolbox.time.Clock +import org.finos.vuu.core.module.auths.PermissionModule.ColumnNames._ +import org.finos.vuu.core.module.auths.PermissionSet +import org.finos.vuu.core.module.auths.PermissionSet.{AlgoCoveragePermission, HighTouchPermission, SalesTradingPermission} import org.finos.vuu.core.table.{DataTable, EmptyRowData, RowWithData} import org.finos.vuu.net.ClientSessionId import org.finos.vuu.net.rpc.RpcHandler -import org.finos.vuu.viewport.{NoAction, SelectionViewPortMenuItem, ViewPortAction, ViewPortMenu, ViewPortSelection} -import org.finos.vuu.core.module.auths.PermissionModule.ColumnNames._ -import org.finos.vuu.core.module.auths.PermissionSet -import org.finos.vuu.core.module.auths.PermissionSet.{AlgoCoveragePermission, HighTouchPermission, SalesTradingPermission, SalesTradingPermissionString} +import org.finos.vuu.viewport._ class PermissionsRpcService(val table: DataTable)(implicit clock: Clock) extends RpcHandler with StrictLogging { diff --git a/vuu/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala b/example/permission/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala similarity index 98% rename from vuu/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala rename to example/permission/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala index 1890a5f8a..bc58c0f29 100644 --- a/vuu/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala +++ b/example/permission/src/test/scala/org/finos/vuu/core/module/authn/AuthNServerTest.scala @@ -1,25 +1,25 @@ package org.finos.vuu.core.module.authn import com.typesafe.scalalogging.StrictLogging -import org.finos.vuu.core.{VuuSecurityOptions, VuuServer, VuuServerConfig, VuuWebSocketOptions} -import org.finos.vuu.core.module.vui.VuiStateModule -import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator} -import org.finos.vuu.net.auth.AlwaysHappyAuthenticator -import org.finos.vuu.net.http.VuuHttp2ServerOptions -import org.finos.vuu.state.MemoryBackedVuiStateStore -import io.vertx.core.{Vertx, VertxOptions} import io.vertx.core.json.JsonObject +import io.vertx.core.{Vertx, VertxOptions} import io.vertx.ext.web.client.WebClientOptions import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.thread.Async import org.finos.toolbox.time.{Clock, DefaultClock} import org.finos.vuu.core.module.TableDefContainer +import org.finos.vuu.core.module.vui.VuiStateModule +import org.finos.vuu.core.{VuuSecurityOptions, VuuServer, VuuServerConfig, VuuWebSocketOptions} +import org.finos.vuu.net.auth.AlwaysHappyAuthenticator +import org.finos.vuu.net.http.VuuHttp2ServerOptions +import org.finos.vuu.net.{Authenticator, LoggedInTokenValidator} +import org.finos.vuu.state.MemoryBackedVuiStateStore import org.scalatest.featurespec.AnyFeatureSpec import org.scalatest.matchers.should.Matchers import java.util.concurrent.atomic.AtomicBoolean -import scala.concurrent.{Await, ExecutionContext} +import scala.concurrent.ExecutionContext class AuthNServerTest extends AnyFeatureSpec with Matchers with StrictLogging { diff --git a/example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionFilteredViewport.scala b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionFilteredViewport.scala new file mode 100644 index 000000000..47a3bc175 --- /dev/null +++ b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionFilteredViewport.scala @@ -0,0 +1,158 @@ +//package org.finos.vuu.core.module.auths +// +//import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} +//import org.finos.toolbox.lifecycle.LifecycleContainer +//import org.finos.toolbox.time.{Clock, DefaultClock} +//import org.finos.vuu.api.{JoinSpec, JoinTableDef, JoinTo, LeftOuterJoin, TableDef} +//import org.finos.vuu.client.messages.RequestId +//import org.finos.vuu.core.table.{Columns, DataTable, TableContainer, ViewPortColumnCreator} +//import org.finos.vuu.net.ClientSessionId +//import org.finos.vuu.provider.{JoinTableProvider, JoinTableProviderImpl, MockProvider, ProviderContainer} +//import org.finos.vuu.util.OutboundRowPublishQueue +//import org.finos.vuu.viewport.{TestTimeStamp, ViewPortContainer, ViewPortRange} +//import org.joda.time.LocalDateTime +//import org.scalatest.featurespec.AnyFeatureSpec +//import org.scalatest.matchers.should.Matchers +//import org.scalatest.prop.Tables.Table +// +//class PermissionFilteredViewport extends AnyFeatureSpec with Matchers with ViewPortSetup { +// +// import org.finos.vuu.viewport.TestTimeStamp.EPOCH_DEFAULT +// +// def setupPermission()(implicit lifecycleContainer: LifecycleContainer, +// timeProvider: Clock, metrics: MetricsProvider): (JoinTableProvider, DataTable, DataTable, DataTable, MockProvider, MockProvider, ViewPortContainer) = { +// +// val dateTime = new LocalDateTime(2015, 7, 24, 11, 0).toDateTime.toInstant.getMillis +// +// val ordersDef = TableDef( +// name = "orderPermission", +// keyField = "orderId", +// columns = Columns.fromNames("orderId:String", "trader:String", "ric:String", "tradeTime:Long", "quantity:Double", "ownerMask:Int"), +// joinFields = "ric", "orderId" +// ).withPermissions((vp, vs) => new TestFriendlyPermissionChecker(vp)) +// +// val pricesDef = TableDef("prices", "ric", Columns.fromNames("ric:String", "bid:Double", "ask:Double", "last:Double", "open:Double", "close:Double"), "ric") +// +// val joinDef = JoinTableDef( +// name = "orderPrices", +// baseTable = ordersDef, +// joinColumns = Columns.allFrom(ordersDef) ++ Columns.allFromExcept(pricesDef, "ric"), +// joins = +// JoinTo( +// table = pricesDef, +// joinSpec = JoinSpec(left = "ric", right = "ric", LeftOuterJoin) +// ), +// joinFields = Seq() +// ) +// +// val joinProvider = JoinTableProviderImpl() +// +// val tableContainer = new TableContainer(joinProvider) +// +// val orders = tableContainer.createTable(ordersDef) +// val prices = tableContainer.createTable(pricesDef) +// val orderPrices = tableContainer.createJoinTable(joinDef) +// +// val ordersProvider = new MockProvider(orders) +// val pricesProvider = new MockProvider(prices) +// +// val providerContainer = new ProviderContainer(joinProvider) +// +// val viewPortContainer = new ViewPortContainer(tableContainer, providerContainer) +// +// (joinProvider, orders, prices, orderPrices, ordersProvider, pricesProvider, viewPortContainer) +// } +// +// +// def tickInPermissionData(ordersProvider: MockProvider, pricesProvider: MockProvider): Unit = { +// ordersProvider.tick("NYC-0001", Map("orderId" -> "NYC-0001", "trader" -> "chris", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 100, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.AlgoCoveragePermission)) +// ordersProvider.tick("NYC-0002", Map("orderId" -> "NYC-0002", "trader" -> "chris", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 200, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.AlgoCoveragePermission)) +// ordersProvider.tick("NYC-0003", Map("orderId" -> "NYC-0003", "trader" -> "chris", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 300, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.SalesTradingPermission)) +// ordersProvider.tick("NYC-0004", Map("orderId" -> "NYC-0004", "trader" -> "chris", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 400, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.SalesTradingPermission)) +// ordersProvider.tick("NYC-0005", Map("orderId" -> "NYC-0005", "trader" -> "chris", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 500, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.SalesTradingPermission)) +// ordersProvider.tick("NYC-0006", Map("orderId" -> "NYC-0006", "trader" -> "steve", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 600, "ric" -> "VOD.L", "ownerMask" -> PermissionSet.HighTouchPermission)) +// ordersProvider.tick("NYC-0007", Map("orderId" -> "NYC-0007", "trader" -> "steve", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 1000, "ric" -> "BT.L", "ownerMask" -> PermissionSet.HighTouchPermission)) +// ordersProvider.tick("NYC-0008", Map("orderId" -> "NYC-0008", "trader" -> "steve", "tradeTime" -> EPOCH_DEFAULT, "quantity" -> 500, "ric" -> "BT.L", "ownerMask" -> PermissionSet.HighTouchPermission)) +// +// pricesProvider.tick("VOD.L", Map("ric" -> "VOD.L", "bid" -> 220.0, "ask" -> 222.0)) +// pricesProvider.tick("BT.L", Map("ric" -> "BT.L", "bid" -> 500.0, "ask" -> 501.0)) +// } +// +// Feature("Permissioned Vuu Port Feature") { +// +// Scenario("Check filtering table based on permissions") { +// +// implicit val clock: Clock = new DefaultClock +// implicit val lifecycle: LifecycleContainer = new LifecycleContainer +// implicit val metrics: MetricsProvider = new MetricsProviderImpl +// +// val (joinProvider, orders, _, _, ordersProvider, pricesProvider, viewPortContainer) = setupPermission() +// +// joinProvider.start() +// +// tickInPermissionData(ordersProvider, pricesProvider) +// +// joinProvider.runOnce() +// +// val queue = new OutboundRowPublishQueue() +// val session = ClientSessionId("A", "B") +// val columns = ViewPortColumnCreator.create(orders, orders.getTableDef.columns.map(_.name).toList) +// val range = ViewPortRange(0, 20) +// val viewport = viewPortContainer.create(RequestId.oneNew(), session, queue, orders, range, columns) +// +// val permissionChecker = viewport.permissionChecker().get.asInstanceOf[TestFriendlyPermissionChecker] +// permissionChecker.addRole(PermissionSet.SalesTradingPermission) +// +// runContainersOnce(viewPortContainer, joinProvider) +// +// assertVpEq(filterByVpId(combineQs(viewport), viewport)) { +// Table( +// ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","ownerMask"), +// ("NYC-0003","chris" ,"VOD.L" ,1311544800000L,300 ,1 ), +// ("NYC-0004","chris" ,"VOD.L" ,1311544800000L,400 ,1 ), +// ("NYC-0005","chris" ,"VOD.L" ,1311544800000L,500 ,1 ) +// ) +// } +// +// permissionChecker.addRole(PermissionSet.AlgoCoveragePermission) +// +// runContainersOnce(viewPortContainer, joinProvider) +// +// assertVpEq(filterByVpId(combineQs(viewport), viewport)) { +// Table( +// ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","ownerMask"), +// ("NYC-0001","chris" ,"VOD.L" ,1311544800000L,100 ,2 ), +// ("NYC-0002","chris" ,"VOD.L" ,1311544800000L,200 ,2 ), +// ("NYC-0003","chris" ,"VOD.L" ,1311544800000L,300 ,1 ), +// ("NYC-0004","chris" ,"VOD.L" ,1311544800000L,400 ,1 ), +// ("NYC-0005","chris" ,"VOD.L" ,1311544800000L,500 ,1 ) +// ) +// } +// +// permissionChecker.removeRole(PermissionSet.AlgoCoveragePermission) +// permissionChecker.removeRole(PermissionSet.SalesTradingPermission) +// +// runContainersOnce(viewPortContainer, joinProvider) +// +// assertVpEq(filterByVpId(combineQs(viewport), viewport)) { +// Table( +// ("orderId", "trader", "ric", "tradeTime", "quantity", "ownerMask"), +// ) +// } +// +// permissionChecker.addRole(PermissionSet.HighTouchPermission) +// +// runContainersOnce(viewPortContainer, joinProvider) +// +// assertVpEq(filterByVpId(combineQs(viewport), viewport)) { +// Table( +// ("orderId" ,"trader" ,"ric" ,"tradeTime","quantity","ownerMask"), +// ("NYC-0006","steve" ,"VOD.L" ,1311544800000L,600 ,4 ), +// ("NYC-0007","steve" ,"BT.L" ,1311544800000L,1000 ,4 ), +// ("NYC-0008","steve" ,"BT.L" ,1311544800000L,500 ,4 ) +// ) +// } +// +// } +// } +//} diff --git a/vuu/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala similarity index 99% rename from vuu/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala rename to example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala index 12ddfd34e..66f3b3dab 100644 --- a/vuu/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala +++ b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/PermissionsTest.scala @@ -1,12 +1,11 @@ package org.finos.vuu.core.module.auths import com.typesafe.scalalogging.StrictLogging +import org.finos.vuu.core.module.auths.PermissionSet._ import org.scalatest.GivenWhenThen import org.scalatest.featurespec.AnyFeatureSpec import org.scalatest.matchers.should.Matchers -import org.finos.vuu.core.module.auths.PermissionSet._ - class PermissionsTest extends AnyFeatureSpec with Matchers with StrictLogging with GivenWhenThen { Feature("Check our example Permission Set"){ diff --git a/vuu/src/test/scala/org/finos/vuu/viewport/auths/TestFriendlyPermissionChecker.scala b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/TestFriendlyPermissionChecker.scala similarity index 91% rename from vuu/src/test/scala/org/finos/vuu/viewport/auths/TestFriendlyPermissionChecker.scala rename to example/permission/src/test/scala/org/finos/vuu/core/module/auths/TestFriendlyPermissionChecker.scala index de9252159..7426bf0af 100644 --- a/vuu/src/test/scala/org/finos/vuu/viewport/auths/TestFriendlyPermissionChecker.scala +++ b/example/permission/src/test/scala/org/finos/vuu/core/module/auths/TestFriendlyPermissionChecker.scala @@ -1,8 +1,7 @@ -package org.finos.vuu.viewport.auths +package org.finos.vuu.core.module.auths import com.typesafe.scalalogging.StrictLogging import org.finos.vuu.core.auths.RowPermissionChecker -import org.finos.vuu.core.module.auths.PermissionSet import org.finos.vuu.core.table.{Column, RowData} import org.finos.vuu.viewport.ViewPort diff --git a/example/pom.xml b/example/pom.xml new file mode 100644 index 000000000..98125aa8e --- /dev/null +++ b/example/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + org.finos.vuu + vuu-parent + 0.5.09-SNAPSHOT + + + pom + + example + + + editable + main + order + permission + price + basket + + + + + + \ No newline at end of file diff --git a/example/price/pom.xml b/example/price/pom.xml new file mode 100644 index 000000000..e54daacaa --- /dev/null +++ b/example/price/pom.xml @@ -0,0 +1,262 @@ + + + 4.0.0 + + + org.finos.vuu + example + 0.5.09-SNAPSHOT + + + + price + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + + + + org.finos.vuu + vuu + 0.5.09-SNAPSHOT + tests + test-jar + test + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + + + + junit + junit + 4.13.2 + test + + + + org.scalatest + scalatest_2.13 + ${scalatest.version} + test + + + org.scala-lang + scala-library + + + org.scala-lang + scala-reflect + + + + + + + + + + + legal-report + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + **/*.scala + + + + + + + + + + src/main/java + src/test/java + + + + + org.apache.maven.plugins + maven-source-plugin + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-release-plugin + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.ow2.asm + asm + 6.2 + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + + + compile + testCompile + + + + + src/main/scala + src/test/scala + + -Xms64m + -Xmx1024m + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + generate-sources + + add-source + + + + target/generated-sources/antlr4 + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + test-jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7 + + + + + + + org.scalatest + scalatest-maven-plugin + 2.0.2 + + ${project.build.directory}/surefire-reports + . + test-reports.txt + + + + test + + test + + + + + + + + + + + org.scala-tools + maven-scala-plugin + ${maven.scala.plugin} + + ${scala.version} + + + + + + \ No newline at end of file diff --git a/vuu/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala b/example/price/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala similarity index 50% rename from vuu/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala rename to example/price/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala index a0693a425..6254f5b59 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala +++ b/example/price/src/main/scala/org/finos/vuu/core/module/price/PriceModule.scala @@ -1,13 +1,44 @@ package org.finos.vuu.core.module.price +import com.typesafe.scalalogging.StrictLogging import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.time.Clock import org.finos.vuu.api.{AutoSubscribeTableDef, ViewPortDef} import org.finos.vuu.core.module.ModuleFactory.stringToString -import org.finos.vuu.core.module.simul.PricesService import org.finos.vuu.core.module.{ModuleFactory, TableDefContainer, ViewServerModule} -import org.finos.vuu.core.table.Columns +import org.finos.vuu.core.table.{Columns, DataTable} +import org.finos.vuu.net.ClientSessionId +import org.finos.vuu.net.rpc.RpcHandler +import org.finos.vuu.provider.Provider import org.finos.vuu.provider.simulation.SimulatedPricesProvider +import org.finos.vuu.viewport._ + + +class PricesService(val table: DataTable, val provider: Provider) extends RpcHandler with StrictLogging { + + private val pricesProvider = provider.asInstanceOf[SimulatedPricesProvider] + + def setSpeedSlow(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { + pricesProvider.setSpeed(8000) + NoAction() + } + + def setSpeedMedium(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { + pricesProvider.setSpeed(2000) + NoAction() + } + + def setSpeedFast(selection: ViewPortSelection, sessionId: ClientSessionId):ViewPortAction = { + pricesProvider.setSpeed(400) + NoAction() + } + + override def menuItems(): ViewPortMenu = ViewPortMenu("Root", + new SelectionViewPortMenuItem("Set Slow", "", this.setSpeedSlow, "SET_SPEED_SLOW"), + new SelectionViewPortMenuItem("Set Medium", "", this.setSpeedMedium, "SET_SPEED_MED"), + new SelectionViewPortMenuItem("Set Fast", "", this.setSpeedFast, "SET_SPEED_FAST") + ) +} object PriceModule { diff --git a/example/price/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala b/example/price/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala new file mode 100644 index 000000000..c7d824eda --- /dev/null +++ b/example/price/src/main/scala/org/finos/vuu/provider/simulation/SimulatedPricesProvider.scala @@ -0,0 +1,354 @@ +package org.finos.vuu.provider.simulation + +import com.typesafe.scalalogging.StrictLogging +import org.finos.toolbox.lifecycle.LifecycleContainer +import org.finos.toolbox.logging.LogAtFrequency +import org.finos.toolbox.thread.{LifeCycleRunner, RunInThread} +import org.finos.toolbox.time.Clock +import org.finos.vuu.core.table.{DataTable, RowWithData} +import org.finos.vuu.provider.Provider + +import java.util.Random +import java.util.concurrent.ConcurrentHashMap +import scala.jdk.CollectionConverters._ + +trait SimulationMode { + def asCode: Int +} + +case class Simulation(mode: SimulationMode, beganAt: Long, endAt: Long) + +case object TakeAWalk extends SimulationMode { + override def asCode: Int = 1 +} + +case object WidenBidAsk extends SimulationMode { + override def asCode: Int = 2 +} + +case object FastTick extends SimulationMode { + override def asCode: Int = 3 +} + +case object NoOp extends SimulationMode { + override def asCode: Int = 4 +} + +case object Close extends SimulationMode { + override def asCode: Int = 5 +} + +case object Open extends SimulationMode { + override def asCode: Int = 6 +} + +object PricesFields { + final val Ric = "ric" + final val Bid = "bid" + final val Ask = "ask" + final val BidSize = "bidSize" + final val AskSize = "askSize" + final val Last = "last" + final val Close = "close" + final val Open = "open" + final val Scenario = "scenario" + final val Phase = "phase" +} + +class SimulatedPricesProvider(val table: DataTable, @volatile var maxSleep: Int = 400)(implicit val timeProvider: Clock, lifecycle: LifecycleContainer) extends Provider with StrictLogging with RunInThread { + private val currentModes = new ConcurrentHashMap[String, Simulation]() + private val states = new ConcurrentHashMap[String, Map[String, Any]]() + + private var cycleCount = 0 + + val runner = new LifeCycleRunner("pricesProvider", () => runOnce()) + + lifecycle(this).dependsOn(runner) + + val logAt = new LogAtFrequency(10_000) + + val doEvery5Mins = new LogAtFrequency(1000 * 60 * 3) + + def setSpeed(maxSpeed: Int): Unit = { + this.maxSleep = maxSpeed + } + + override def subscribe(key: String): Unit = { + //logger.info(s"Prices Subscribe Called: ${key}") + val began = timeProvider.now() + val end = began + seededRand(began, 100, 1000) + currentModes.put(key, Simulation(NoOp, began, end)) + } + + private def seededRand(seed: Long, low: Int, high: Int): Int = { + val r = new Random(seed) + r.nextInt(high - low) + low + } + + override def runOnce(): Unit = { + + val entrySet = SetHasAsScala(currentModes.entrySet()).asScala + + // if(logAt.shouldLog()){ + // logger.info("Cycle Count = " + cycleCount) + // } + + if (doEvery5Mins.shouldLog()) { + val startOfOpen = timeProvider.now() + 5_000 + logger.info("[PRICES] Moving into Closed Market...") + entrySet.foreach(me => { + closeMarket(me.getKey, startOfOpen) + }) + } + else { + entrySet.foreach(me => { + processOne(me.getKey, me.getValue) + }) + } + + cycleCount += 1 + + timeProvider.sleep(seededRand(timeProvider.now(), 10, maxSleep)) + } + + protected def closeMarket(ric: String, timeToOpen: Long): Unit = { + val newRow = getState(ric) match { + case Some(row) => mergeLeft(row, close(ric, row)) + case None => Map(f.Ric -> ric) //do nothing + } + + currentModes.put(ric, Simulation(Close, this.timeProvider.now(), timeToOpen)) + + setState(ric, newRow) + table.processUpdate(ric, RowWithData(ric, newRow), timeProvider.now()) + } + + protected def processOne(ric: String, simulation: Simulation): Unit = { + val newRow = if (simulation.endAt <= timeProvider.now()) { + if (simulation.mode.equals(Close)) { + assignSpecificSimulation(ric, Open) + } + else { + assignNewSimulation(ric) + } + } else { + simulation.mode match { + case NoOp => doNoOp(ric) + case TakeAWalk => doTakeAWalk(ric) + case WidenBidAsk => + doWidenBidAndAsk(ric) + case FastTick => doFastTick(ric) + case Close => doCloseTick(ric) + case Open => doOpenTick(ric) + } + } + + setState(ric, newRow) + + table.processUpdate(ric, RowWithData(ric, newRow), timeProvider.now()) + } + + private def getState(ric: String): Option[Map[String, Any]] = { + val theState = states.get(ric) + Option(theState) + } + + private def setState(ric: String, row: Map[String, Any]): Unit = { + states.put(ric, row) + } + + protected def doTakeAWalk(ric: String): Map[String, Any] = { + val smallInc = seededRand(timeProvider.now(), 0, 100) + + val newRow = getState(ric) match { + case Some(row) => mergeLeft(row, walkBidAndAsk(ric, row)) + case None => buildSampleRow(ric) + } + newRow + } + + val f: PricesFields.type = PricesFields + + private def close(ric: String, existing: Map[String, Any]): Map[String, Any] = { + + val price = existing.get(f.Bid) match { + case Some(bid) => bid + case None => existing.get(f.Ask) match { + case Some(ask) => ask + case None => existing.get(f.Last) match { + case Some(last) => last + case None => seededRand(timeProvider.now(), 0, 10000) + } + } + } + + Map(f.Ric -> ric, f.Close -> price, f.Open -> null, f.Scenario -> "close", f.Phase -> "X") + } + + private def walkBidAndAsk(ric: String, existing: Map[String, Any]) = { + if (!existing.contains(f.Bid)) + buildSampleRow(existing(f.Ric).asInstanceOf[String]) + else { + val bid = existing(f.Bid).asInstanceOf[Double] + val ask = existing(f.Ask).asInstanceOf[Double] + val diff = ask - bid + val inc = seededRand(timeProvider.now(), 0, 50) + val delta = (inc / 100).asInstanceOf[Double] + + Map(f.Ric -> ric, f.Bid -> (bid + delta), f.Ask -> (ask + delta), f.Scenario -> "walkBidAsk", f.Phase -> "C") + } + } + + def BidAskSize(): Map[String, Any] = { + val bidSize = seededRand(timeProvider.now(), 1, 20) * 100 + val askSize = seededRand(timeProvider.now(), 1, 20) * 100 + Map(f.BidSize -> bidSize, f.AskSize -> askSize) + } + + def BidAskSizeNull(): Map[String, Any] = { + Map(f.BidSize -> null, f.AskSize -> null) + } + + protected def mergeLeft(existing: Map[String, Any], newMap: Map[String, Any]): Map[String, Any] = { + existing ++ newMap + } + + protected def buildSampleRow(ric: String): Map[String, Any] = { + val basePrice = seededRand(timeProvider.now(), 0, 10000) + val adjusted = (basePrice / 100).asInstanceOf[Double] + val spread = seededRand(timeProvider.now(), 0, 100) + val adjustedSpread = (spread / 100).asInstanceOf[Double] + val askSize = seededRand(timeProvider.now(), 0, 1000) + val bidSize = seededRand(timeProvider.now(), 0, 2000) + + Map(f.Ric -> ric, f.Ask -> (adjusted + adjustedSpread), f.Bid -> (adjusted - adjustedSpread), f.Phase -> "C") ++ BidAskSize() + } + + final val MaxSpread = 100 + + protected def doWidenBidAndAsk(ric: String): Map[String, Any] = { + if (!states.get(ric).contains(ric)) { + seedStartValues(ric) + } else { + val spread = seededRand(timeProvider.now(), 1, 80) + getState(ric) match { + case Some(state) => + val bid = state(f.Bid).asInstanceOf[Double] + val ask = state(f.Ask).asInstanceOf[Double] + val spread = ask - bid + val activeSpread = if (spread > MaxSpread) + 0.0 + else + spread + + val newBid = bid - activeSpread + val newAsk = ask + activeSpread + + Map(f.Ric -> ric, f.Ask -> newAsk, f.Bid -> newBid, f.Scenario -> "widenBidAndAsk", f.Phase -> "C") ++ BidAskSize() + case None => throw new Exception("shouldn't get here") + } + } + } + + protected def doFastTick(ric: String): Map[String, Any] = { + + if (!states.get(ric).contains(f.Bid)) + seedStartValues(ric) + else { + val bidAdjust = seededRand(timeProvider.now(), 0, 10) + val askAdjust = seededRand(timeProvider.now(), 0, 20) + val bid = states.get(ric)(f.Bid).asInstanceOf[Double] + bidAdjust + val ask = states.get(ric)(f.Ask).asInstanceOf[Double] + askAdjust + val last = states.get(ric)(f.Ask).asInstanceOf[Double] + (askAdjust / 2) + Map(f.Ric -> ric, f.Ask -> ask, f.Bid -> bid, f.Scenario -> "fastTick", f.Last -> last, f.Phase -> "C") ++ BidAskSize() + } + } + + protected def doOpenTick(ric: String): Map[String, Any] = { + + if (!states.get(ric).contains(f.Bid)) + seedStartValues(ric) + else { + val bidAdjust = seededRand(timeProvider.now(), 0, 10) + val askAdjust = seededRand(timeProvider.now(), 0, 20) + val bid = states.get(ric)(f.Bid).asInstanceOf[Double] + bidAdjust + val ask = states.get(ric)(f.Ask).asInstanceOf[Double] + askAdjust + val open = states.get(ric)(f.Ask).asInstanceOf[Double] + (askAdjust / 2) + Map(f.Ric -> ric, f.Scenario -> "open", f.Open -> open, f.Phase -> "O") ++ BidAskSize() + } + } + + protected def doCloseTick(ric: String): Map[String, Any] = { + + if (!states.get(ric).contains(f.Bid)) + seedStartValues(ric) + else { + val bidAdjust = seededRand(timeProvider.now(), 0, 10) + val askAdjust = seededRand(timeProvider.now(), 0, 20) + val bid = states.get(ric)(f.Bid).asInstanceOf[Double] + bidAdjust + val ask = states.get(ric)(f.Ask).asInstanceOf[Double] + askAdjust + val open = states.get(ric)(f.Ask).asInstanceOf[Double] + (askAdjust / 2) + Map(f.Ric -> ric, f.Scenario -> "close", f.Phase -> "X") ++ BidAskSizeNull() + } + } + + protected def seedStartValues(ric: String): Map[String, Any] = { + val bid: Double = seededRand(timeProvider.now(), 0, 1000) + val ask: Double = bid + (bid / 100) + val bidSize = seededRand(timeProvider.now(), 0, 1000) + val askSize = seededRand(timeProvider.now(), 0, 1000) + Map(f.Ric -> ric, f.Ask -> ask, f.Bid -> bid, f.Phase -> "C") ++ BidAskSize() + } + + protected def doNoOp(ric: String): Map[String, Any] = { + getState(ric) match { + case Some(row) => mergeLeft(row, Map[String, Any](f.Scenario -> "noop")) + case None => buildSampleRow(ric) + } + } + + protected def assignNewSimulation(ric: String): Map[String, Any] = { + val strategy = seededRand(timeProvider.now(), 1, 4) + val impl = strategy match { + case 1 => TakeAWalk + case 2 => WidenBidAsk + case 3 => FastTick + case 4 => NoOp + } + + val begin = timeProvider.now() + val end = seededRand(begin, 10, 10000) + + currentModes.put(ric, Simulation(impl, begin, begin + end)) + + val existing = states.get(ric) + if (existing == null) + buildSampleRow(ric) + else + existing + } + + protected def assignSpecificSimulation(ric: String, impl: SimulationMode): Map[String, Any] = { + + val begin = timeProvider.now() + val end = seededRand(begin, 9_000, 10_000) + + currentModes.put(ric, Simulation(impl, begin, begin + end)) + + val existing = states.get(ric) + if (existing == null) + buildSampleRow(ric) + else + existing + } + + override def doStop(): Unit = {} + + override def doStart(): Unit = {} + + override def doInitialize(): Unit = {} + + override def doDestroy(): Unit = {} + + override val lifecycleId: String = "simulationPrices" +} diff --git a/vuu/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala b/example/price/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala similarity index 95% rename from vuu/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala rename to example/price/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala index 0143e9fb3..0cada0f1f 100644 --- a/vuu/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala +++ b/example/price/src/test/scala/org/finos/vuu/provider/simulation/SimulatedPricesProviderTest.scala @@ -1,15 +1,15 @@ package org.finos.vuu.provider.simulation -import org.finos.vuu.api.TableDef -import org.finos.vuu.core.table.{Columns, SimpleDataTable, ViewPortColumnCreator} -import org.finos.vuu.provider.TestFriendlyJoinTableProvider import org.finos.toolbox.jmx.{MetricsProvider, MetricsProviderImpl} import org.finos.toolbox.lifecycle.LifecycleContainer import org.finos.toolbox.text.AsciiUtil -import org.finos.toolbox.time.{Clock, TestFriendlyClock} +import org.finos.toolbox.time.TestFriendlyClock +import org.finos.vuu.api.TableDef +import org.finos.vuu.core.table.{Columns, SimpleDataTable, ViewPortColumnCreator} import org.scalatest.featurespec.AnyFeatureSpec import org.scalatest.matchers.should.Matchers + class SimulatedPricesProviderTest extends AnyFeatureSpec with Matchers { final val TEST_TIME = 1450770869442L diff --git a/example/price/src/test/scala/org/finos/vuu/provider/simulation/TestFriendlyJoinTableProvider.scala b/example/price/src/test/scala/org/finos/vuu/provider/simulation/TestFriendlyJoinTableProvider.scala new file mode 100644 index 000000000..77769a463 --- /dev/null +++ b/example/price/src/test/scala/org/finos/vuu/provider/simulation/TestFriendlyJoinTableProvider.scala @@ -0,0 +1,21 @@ +package org.finos.vuu.provider.simulation + +import org.finos.vuu.core.table.{DataTable, JoinTableUpdate} +import org.finos.vuu.provider.JoinTableProvider + +import java.util + +class TestFriendlyJoinTableProvider extends JoinTableProvider { + override def hasJoins(tableName: String): Boolean = {false} + override def sendEvent(tableName: String, ev: util.HashMap[String, Any]): Unit = {} + override def addJoinTable(join: DataTable): Unit = {} + override def runOnce(): Unit = {} + override def start(): Unit = ??? + + override def doStop(): Unit = ??? + override def doStart(): Unit = ??? + override def doInitialize(): Unit = ??? + override def doDestroy(): Unit = ??? + override val lifecycleId: String = "testFriendlyJoinProvider" + override def drainQueue_ForTesting(): (Int, util.ArrayList[JoinTableUpdate]) = ??? +} diff --git a/pom.xml b/pom.xml index 06993cb6e..94f39e1f5 100644 --- a/pom.xml +++ b/pom.xml @@ -83,6 +83,7 @@ vuu vuu-ui benchmark + example diff --git a/vuu-ui/packages/vuu-data/src/inlined-worker.js b/vuu-ui/packages/vuu-data/src/inlined-worker.js index 5b687bae0..b5dbc1ab4 100644 --- a/vuu-ui/packages/vuu-data/src/inlined-worker.js +++ b/vuu-ui/packages/vuu-data/src/inlined-worker.js @@ -1,2572 +1,8 @@ export const workerSourceCode = ` -var __accessCheck = (obj, member, msg) => { - if (!member.has(obj)) - throw TypeError("Cannot " + msg); -}; -var __privateGet = (obj, member, getter) => { - __accessCheck(obj, member, "read from private field"); - return getter ? getter.call(obj) : member.get(obj); -}; -var __privateAdd = (obj, member, value) => { - if (member.has(obj)) - throw TypeError("Cannot add the same private member more than once"); - member instanceof WeakSet ? member.add(obj) : member.set(obj, value); -}; -var __privateSet = (obj, member, value, setter) => { - __accessCheck(obj, member, "write to private field"); - setter ? setter.call(obj, value) : member.set(obj, value); - return value; -}; - -// ../vuu-utils/src/array-utils.ts -function partition(array, test, pass = [], fail = []) { - for (let i = 0, len = array.length; i < len; i++) { - (test(array[i], i) ? pass : fail).push(array[i]); - } - return [pass, fail]; -} - -// ../vuu-utils/src/column-utils.ts -var metadataKeys = { - IDX: 0, - RENDER_IDX: 1, - IS_LEAF: 2, - IS_EXPANDED: 3, - DEPTH: 4, - COUNT: 5, - KEY: 6, - SELECTED: 7, - count: 8, - // TODO following only used in datamodel - PARENT_IDX: "parent_idx", - IDX_POINTER: "idx_pointer", - FILTER_COUNT: "filter_count", - NEXT_FILTER_IDX: "next_filter_idx" -}; -var { DEPTH, IS_LEAF } = metadataKeys; - -// ../vuu-utils/src/cookie-utils.ts -var getCookieValue = (name) => { - var _a, _b; - if (((_a = globalThis.document) == null ? void 0 : _a.cookie) !== void 0) { - return (_b = globalThis.document.cookie.split("; ").find((row) => row.startsWith(\`\${name}=\`))) == null ? void 0 : _b.split("=")[1]; - } -}; - -// ../vuu-utils/src/range-utils.ts -function getFullRange({ from, to }, bufferSize = 0, rowCount = Number.MAX_SAFE_INTEGER) { - if (bufferSize === 0) { - if (rowCount < from) { - return { from: 0, to: 0 }; - } else { - return { from, to: Math.min(to, rowCount) }; - } - } else if (from === 0) { - return { from, to: Math.min(to + bufferSize, rowCount) }; - } else { - const rangeSize = to - from; - const buff = Math.round(bufferSize / 2); - const shortfallBefore = from - buff < 0; - const shortFallAfter = rowCount - (to + buff) < 0; - if (shortfallBefore && shortFallAfter) { - return { from: 0, to: rowCount }; - } else if (shortfallBefore) { - return { from: 0, to: rangeSize + bufferSize }; - } else if (shortFallAfter) { - return { - from: Math.max(0, rowCount - (rangeSize + bufferSize)), - to: rowCount - }; - } else { - return { from: from - buff, to: to + buff }; - } - } -} -var withinRange = (value, { from, to }) => value >= from && value < to; -var WindowRange = class { - constructor(from, to) { - this.from = from; - this.to = to; - } - isWithin(index) { - return withinRange(index, this); - } - //find the overlap of this range and a new one - overlap(from, to) { - return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)]; - } - copy() { - return new WindowRange(this.from, this.to); - } -}; - -// ../vuu-utils/src/DataWindow.ts -var { KEY } = metadataKeys; - -// ../vuu-utils/src/logging-utils.ts -var logLevels = ["error", "warn", "info", "debug"]; -var isValidLogLevel = (value) => typeof value === "string" && logLevels.includes(value); -var DEFAULT_LOG_LEVEL = "error"; -var NO_OP = () => void 0; -var DEFAULT_DEBUG_LEVEL = false ? "error" : "info"; -var { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings(); -var logger = (category) => { - const debugEnabled5 = loggingLevel === "debug"; - const infoEnabled5 = debugEnabled5 || loggingLevel === "info"; - const warnEnabled = infoEnabled5 || loggingLevel === "warn"; - const errorEnabled = warnEnabled || loggingLevel === "error"; - const info5 = infoEnabled5 ? (message) => console.info(\`[\${category}] \${message}\`) : NO_OP; - const warn4 = warnEnabled ? (message) => console.warn(\`[\${category}] \${message}\`) : NO_OP; - const debug5 = debugEnabled5 ? (message) => console.debug(\`[\${category}] \${message}\`) : NO_OP; - const error4 = errorEnabled ? (message) => console.error(\`[\${category}] \${message}\`) : NO_OP; - if (false) { - return { - errorEnabled, - error: error4 - }; - } else { - return { - debugEnabled: debugEnabled5, - infoEnabled: infoEnabled5, - warnEnabled, - errorEnabled, - info: info5, - warn: warn4, - debug: debug5, - error: error4 - }; - } -}; -function getLoggingSettings() { - if (typeof loggingSettings !== "undefined") { - return loggingSettings; - } else { - return { - loggingLevel: getLoggingLevelFromCookie() - }; - } -} -function getLoggingLevelFromCookie() { - const value = getCookieValue("vuu-logging-level"); - if (isValidLogLevel(value)) { - return value; - } else { - return DEFAULT_LOG_LEVEL; - } -} - -// ../vuu-utils/src/debug-utils.ts -var { debug, debugEnabled } = logger("range-monitor"); -var RangeMonitor = class { - constructor(source) { - this.source = source; - this.range = { from: 0, to: 0 }; - this.timestamp = 0; - } - isSet() { - return this.timestamp !== 0; - } - set({ from, to }) { - const { timestamp } = this; - this.range.from = from; - this.range.to = to; - this.timestamp = performance.now(); - if (timestamp) { - debugEnabled && debug( - \`<\${this.source}> [\${from}-\${to}], \${(this.timestamp - timestamp).toFixed(0)} ms elapsed\` - ); - } else { - return 0; - } - } -}; - -// ../vuu-utils/src/event-emitter.ts -function isArrayOfListeners(listeners) { - return Array.isArray(listeners); -} -function isOnlyListener(listeners) { - return !Array.isArray(listeners); -} -var _events; -var EventEmitter = class { - constructor() { - __privateAdd(this, _events, /* @__PURE__ */ new Map()); - } - addListener(event, listener) { - const listeners = __privateGet(this, _events).get(event); - if (!listeners) { - __privateGet(this, _events).set(event, listener); - } else if (isArrayOfListeners(listeners)) { - listeners.push(listener); - } else if (isOnlyListener(listeners)) { - __privateGet(this, _events).set(event, [listeners, listener]); - } - } - removeListener(event, listener) { - if (!__privateGet(this, _events).has(event)) { - return; - } - const listenerOrListeners = __privateGet(this, _events).get(event); - let position = -1; - if (listenerOrListeners === listener) { - __privateGet(this, _events).delete(event); - } else if (Array.isArray(listenerOrListeners)) { - for (let i = length; i-- > 0; ) { - if (listenerOrListeners[i] === listener) { - position = i; - break; - } - } - if (position < 0) { - return; - } - if (listenerOrListeners.length === 1) { - listenerOrListeners.length = 0; - __privateGet(this, _events).delete(event); - } else { - listenerOrListeners.splice(position, 1); - } - } - } - removeAllListeners(event) { - if (event && __privateGet(this, _events).has(event)) { - __privateGet(this, _events).delete(event); - } else if (event === void 0) { - __privateGet(this, _events).clear(); - } - } - emit(event, ...args) { - if (__privateGet(this, _events)) { - const handler = __privateGet(this, _events).get(event); - if (handler) { - this.invokeHandler(handler, args); - } - } - } - once(event, listener) { - const handler = (...args) => { - this.removeListener(event, handler); - listener(...args); - }; - this.on(event, handler); - } - on(event, listener) { - this.addListener(event, listener); - } - hasListener(event, listener) { - const listeners = __privateGet(this, _events).get(event); - if (Array.isArray(listeners)) { - return listeners.includes(listener); - } else { - return listeners === listener; - } - } - invokeHandler(handler, args) { - if (isArrayOfListeners(handler)) { - handler.slice().forEach((listener) => this.invokeHandler(listener, args)); - } else { - switch (args.length) { - case 0: - handler(); - break; - case 1: - handler(args[0]); - break; - case 2: - handler(args[0], args[1]); - break; - default: - handler.call(null, ...args); - } - } - } -}; -_events = new WeakMap(); - -// ../vuu-utils/src/round-decimal.ts -var PUNCTUATION_STR = String.fromCharCode(8200); -var DIGIT_STR = String.fromCharCode(8199); -var Space = { - DIGIT: DIGIT_STR, - TWO_DIGITS: DIGIT_STR + DIGIT_STR, - THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR, - FULL_PADDING: [ - null, - PUNCTUATION_STR + DIGIT_STR, - PUNCTUATION_STR + DIGIT_STR + DIGIT_STR, - PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR, - PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR - ] -}; -var LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR; - -// ../vuu-utils/src/json-utils.ts -var { COUNT } = metadataKeys; - -// ../vuu-utils/src/keyset.ts -var KeySet = class { - constructor(range) { - this.keys = /* @__PURE__ */ new Map(); - this.free = []; - this.nextKeyValue = 0; - this.reset(range); - } - next() { - if (this.free.length > 0) { - return this.free.pop(); - } else { - return this.nextKeyValue++; - } - } - reset({ from, to }) { - this.keys.forEach((keyValue, rowIndex) => { - if (rowIndex < from || rowIndex >= to) { - this.free.push(keyValue); - this.keys.delete(rowIndex); - } - }); - const size = to - from; - if (this.keys.size + this.free.length > size) { - this.free.length = Math.max(0, size - this.keys.size); - } - for (let rowIndex = from; rowIndex < to; rowIndex++) { - if (!this.keys.has(rowIndex)) { - const nextKeyValue = this.next(); - this.keys.set(rowIndex, nextKeyValue); - } - } - if (this.nextKeyValue > this.keys.size) { - this.nextKeyValue = this.keys.size; - } - } - keyFor(rowIndex) { - const key = this.keys.get(rowIndex); - if (key === void 0) { - console.log(\`key not found +var fe=(s,e,t)=>{if(!e.has(s))throw TypeError("Cannot "+t)};var p=(s,e,t)=>(fe(s,e,"read from private field"),t?t.call(s):e.get(s)),U=(s,e,t)=>{if(e.has(s))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(s):e.set(s,t)},me=(s,e,t,n)=>(fe(s,e,"write to private field"),n?n.call(s,t):e.set(s,t),t);function he(s,e,t=[],n=[]){for(let r=0,o=s.length;r{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split("; ").find(n=>n.startsWith(\`\${s}=\`)))==null?void 0:t.split("=")[1]};function Y({from:s,to:e},t=0,n=Number.MAX_SAFE_INTEGER){if(t===0)return ns>=e&&s=this.to||ttypeof s=="string"&&pt.includes(s),gt="error",F=()=>{},ft="error",{loggingLevel:N=ft}=mt(),E=s=>{let e=N==="debug",t=e||N==="info",n=t||N==="warn",r=n||N==="error",o=t?g=>console.info(\`[\${s}] \${g}\`):F,a=n?g=>console.warn(\`[\${s}] \${g}\`):F,u=e?g=>console.debug(\`[\${s}] \${g}\`):F;return{errorEnabled:r,error:r?g=>console.error(\`[\${s}] \${g}\`):F}};function mt(){return typeof loggingSettings<"u"?loggingSettings:{loggingLevel:ht()}}function ht(){let s=Ce("vuu-logging-level");return dt(s)?s:gt}var{debug:Ct,debugEnabled:bt}=E("range-monitor"),W=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:n}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),n)bt&&Ct(\`<\${this.source}> [\${e}-\${t}], \${(this.timestamp-n).toFixed(0)} ms elapsed\`);else return 0}};function be(s){return Array.isArray(s)}function yt(s){return!Array.isArray(s)}var y,ye=class{constructor(){U(this,y,new Map)}addListener(e,t){let n=p(this,y).get(e);n?be(n)?n.push(t):yt(n)&&p(this,y).set(e,[n,t]):p(this,y).set(e,t)}removeListener(e,t){if(!p(this,y).has(e))return;let n=p(this,y).get(e),r=-1;if(n===t)p(this,y).delete(e);else if(Array.isArray(n)){for(let o=length;o-- >0;)if(n[o]===t){r=o;break}if(r<0)return;n.length===1?(n.length=0,p(this,y).delete(e)):n.splice(r,1)}}removeAllListeners(e){e&&p(this,y).has(e)?p(this,y).delete(e):e===void 0&&p(this,y).clear()}emit(e,...t){if(p(this,y)){let n=p(this,y).get(e);n&&this.invokeHandler(n,t)}}once(e,t){let n=(...r)=>{this.removeListener(e,n),t(...r)};this.on(e,n)}on(e,t){this.addListener(e,t)}hasListener(e,t){let n=p(this,y).get(e);return Array.isArray(n)?n.includes(t):n===t}invokeHandler(e,t){if(be(e))e.slice().forEach(n=>this.invokeHandler(n,t));else switch(t.length){case 0:e();break;case 1:e(t[0]);break;case 2:e(t[0],t[1]);break;default:e.call(null,...t)}}};y=new WeakMap;var \$=String.fromCharCode(8200),m=String.fromCharCode(8199);var In={DIGIT:m,TWO_DIGITS:m+m,THREE_DIGITS:m+m+m,FULL_PADDING:[null,\$+m,\$+m+m,\$+m+m+m,\$+m+m+m+m]};var vn=m+m+m+m+m+m+m+m+m;var{COUNT:jn}=M;var q=class{constructor(e){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(e)}next(){return this.free.length>0?this.free.pop():this.nextKeyValue++}reset({from:e,to:t}){this.keys.forEach((r,o)=>{(o=t)&&(this.free.push(r),this.keys.delete(o))});let n=t-e;this.keys.size+this.free.length>n&&(this.free.length=Math.max(0,n-this.keys.size));for(let r=e;rthis.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(\`key not found keys: \${this.toDebugString()} free : \${this.free.join(",")} - \`); - throw Error(\`KeySet, no key found for rowIndex \${rowIndex}\`); - } - return key; - } - toDebugString() { - return Array.from(this.keys.entries()).map((k, v) => \`\${k}=>\${v}\`).join(","); - } -}; - -// ../vuu-utils/src/row-utils.ts -var { IDX } = metadataKeys; - -// ../vuu-utils/src/selection-utils.ts -var { SELECTED } = metadataKeys; -var RowSelected = { - False: 0, - True: 1, - First: 2, - Last: 4 -}; -var rangeIncludes = (range, index) => index >= range[0] && index <= range[1]; -var SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last; -var FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First; -var LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last; -var getSelectionStatus = (selected, itemIndex) => { - for (const item of selected) { - if (typeof item === "number") { - if (item === itemIndex) { - return SINGLE_SELECTED_ROW; - } - } else if (rangeIncludes(item, itemIndex)) { - if (itemIndex === item[0]) { - return FIRST_SELECTED_ROW_OF_BLOCK; - } else if (itemIndex === item[1]) { - return LAST_SELECTED_ROW_OF_BLOCK; - } else { - return RowSelected.True; - } - } - } - return RowSelected.False; -}; -var expandSelection = (selected) => { - if (selected.every((selectedItem) => typeof selectedItem === "number")) { - return selected; - } - const expandedSelected = []; - for (const selectedItem of selected) { - if (typeof selectedItem === "number") { - expandedSelected.push(selectedItem); - } else { - for (let i = selectedItem[0]; i <= selectedItem[1]; i++) { - expandedSelected.push(i); - } - } - } - return expandedSelected; -}; - -// ../../node_modules/html-to-image/es/util.js -var uuid = (() => { - let counter = 0; - const random = () => ( - // eslint-disable-next-line no-bitwise - \`0000\${(Math.random() * 36 ** 4 << 0).toString(36)}\`.slice(-4) - ); - return () => { - counter += 1; - return \`u\${random()}\${counter}\`; - }; -})(); - -// src/websocket-connection.ts -var { debug: debug2, debugEnabled: debugEnabled2, error, info, infoEnabled, warn } = logger( - "websocket-connection" -); -var WS = "ws"; -var isWebsocketUrl = (url) => url.startsWith(WS + "://") || url.startsWith(WS + "s://"); -var connectionAttemptStatus = {}; -var setWebsocket = Symbol("setWebsocket"); -var connectionCallback = Symbol("connectionCallback"); -async function connect(connectionString, protocol, callback, retryLimitDisconnect = 10, retryLimitStartup = 5) { - connectionAttemptStatus[connectionString] = { - status: "connecting", - connect: { - allowed: retryLimitStartup, - remaining: retryLimitStartup - }, - reconnect: { - allowed: retryLimitDisconnect, - remaining: retryLimitDisconnect - } - }; - return makeConnection(connectionString, protocol, callback); -} -async function reconnect(connection) { - throw Error("connection broken"); -} -async function makeConnection(url, protocol, callback, connection) { - const { - status: currentStatus, - connect: connectStatus, - reconnect: reconnectStatus - } = connectionAttemptStatus[url]; - const trackedStatus = currentStatus === "connecting" ? connectStatus : reconnectStatus; - try { - callback({ type: "connection-status", status: "connecting" }); - const reconnecting = typeof connection !== "undefined"; - const ws = await createWebsocket(url, protocol); - console.info( - "%c\u26A1 %cconnected", - "font-size: 24px;color: green;font-weight: bold;", - "color:green; font-size: 14px;" - ); - if (connection !== void 0) { - connection[setWebsocket](ws); - } - const websocketConnection = connection != null ? connection : new WebsocketConnection(ws, url, protocol, callback); - const status = reconnecting ? "reconnected" : "connection-open-awaiting-session"; - callback({ type: "connection-status", status }); - websocketConnection.status = status; - trackedStatus.remaining = trackedStatus.allowed; - return websocketConnection; - } catch (err) { - const retry = --trackedStatus.remaining > 0; - callback({ - type: "connection-status", - status: "disconnected", - reason: "failed to connect", - retry - }); - if (retry) { - return makeConnectionIn(url, protocol, callback, connection, 2e3); - } else { - throw Error("Failed to establish connection"); - } - } -} -var makeConnectionIn = (url, protocol, callback, connection, delay) => new Promise((resolve) => { - setTimeout(() => { - resolve(makeConnection(url, protocol, callback, connection)); - }, delay); -}); -var createWebsocket = (connectionString, protocol) => new Promise((resolve, reject) => { - const websocketUrl = isWebsocketUrl(connectionString) ? connectionString : \`wss://\${connectionString}\`; - if (infoEnabled && protocol !== void 0) { - info(\`WebSocket Protocol \${protocol == null ? void 0 : protocol.toString()}\`); - } - const ws = new WebSocket(websocketUrl, protocol); - ws.onopen = () => resolve(ws); - ws.onerror = (evt) => reject(evt); -}); -var closeWarn = () => { - warn == null ? void 0 : warn(\`Connection cannot be closed, socket not yet opened\`); -}; -var sendWarn = (msg) => { - warn == null ? void 0 : warn(\`Message cannot be sent, socket closed \${msg.body.type}\`); -}; -var parseMessage = (message) => { - try { - return JSON.parse(message); - } catch (e) { - throw Error(\`Error parsing JSON response from server \${message}\`); - } -}; -var WebsocketConnection = class { - constructor(ws, url, protocol, callback) { - this.close = closeWarn; - this.requiresLogin = true; - this.send = sendWarn; - this.status = "ready"; - this.messagesCount = 0; - this.connectionMetricsInterval = null; - this.handleWebsocketMessage = (evt) => { - const vuuMessageFromServer = parseMessage(evt.data); - this.messagesCount += 1; - if (true) { - if (debugEnabled2 && vuuMessageFromServer.body.type !== "HB") { - debug2 == null ? void 0 : debug2(\`<<< \${vuuMessageFromServer.body.type}\`); - } - } - this[connectionCallback](vuuMessageFromServer); - }; - this.url = url; - this.protocol = protocol; - this[connectionCallback] = callback; - this[setWebsocket](ws); - } - reconnect() { - reconnect(this); - } - [(connectionCallback, setWebsocket)](ws) { - const callback = this[connectionCallback]; - ws.onmessage = (evt) => { - this.status = "connected"; - ws.onmessage = this.handleWebsocketMessage; - this.handleWebsocketMessage(evt); - }; - this.connectionMetricsInterval = setInterval(() => { - callback({ - type: "connection-metrics", - messagesLength: this.messagesCount - }); - this.messagesCount = 0; - }, 2e3); - ws.onerror = () => { - error(\`\u26A1 connection error\`); - callback({ - type: "connection-status", - status: "disconnected", - reason: "error" - }); - if (this.connectionMetricsInterval) { - clearInterval(this.connectionMetricsInterval); - this.connectionMetricsInterval = null; - } - if (this.status === "connection-open-awaiting-session") { - error( - \`Websocket connection lost before Vuu session established, check websocket configuration\` - ); - } else if (this.status !== "closed") { - reconnect(this); - this.send = queue; - } - }; - ws.onclose = () => { - info == null ? void 0 : info(\`\u26A1 connection close\`); - callback({ - type: "connection-status", - status: "disconnected", - reason: "close" - }); - if (this.connectionMetricsInterval) { - clearInterval(this.connectionMetricsInterval); - this.connectionMetricsInterval = null; - } - if (this.status !== "closed") { - reconnect(this); - this.send = queue; - } - }; - const send = (msg) => { - if (true) { - if (debugEnabled2 && msg.body.type !== "HB_RESP") { - debug2 == null ? void 0 : debug2(\`>>> \${msg.body.type}\`); - } - } - ws.send(JSON.stringify(msg)); - }; - const queue = (msg) => { - info == null ? void 0 : info(\`TODO queue message until websocket reconnected \${msg.body.type}\`); - }; - this.send = send; - this.close = () => { - this.status = "closed"; - ws.close(); - this.close = closeWarn; - this.send = sendWarn; - info == null ? void 0 : info("close websocket"); - }; - } -}; - -// src/message-utils.ts -var MENU_RPC_TYPES = [ - "VIEW_PORT_MENUS_SELECT_RPC", - "VIEW_PORT_MENU_TABLE_RPC", - "VIEW_PORT_MENU_ROW_RPC", - "VIEW_PORT_MENU_CELL_RPC", - "VP_EDIT_CELL_RPC", - "VP_EDIT_ROW_RPC", - "VP_EDIT_ADD_ROW_RPC", - "VP_EDIT_DELETE_CELL_RPC", - "VP_EDIT_DELETE_ROW_RPC", - "VP_EDIT_SUBMIT_FORM_RPC" -]; -var isVuuMenuRpcRequest = (message) => MENU_RPC_TYPES.includes(message["type"]); -var stripRequestId = ({ - requestId, - ...rest -}) => [requestId, rest]; -var getFirstAndLastRows = (rows) => { - let firstRow = rows.at(0); - if (firstRow.updateType === "SIZE") { - if (rows.length === 1) { - return rows; - } else { - firstRow = rows.at(1); - } - } - const lastRow = rows.at(-1); - return [firstRow, lastRow]; -}; -var groupRowsByViewport = (rows) => { - const result = {}; - for (const row of rows) { - const rowsForViewport = result[row.viewPortId] || (result[row.viewPortId] = []); - rowsForViewport.push(row); - } - return result; -}; -var createSchemaFromTableMetadata = ({ - columns, - dataTypes, - key, - table -}) => { - return { - table, - columns: columns.map((col, idx) => ({ - name: col, - serverDataType: dataTypes[idx] - })), - key - }; -}; - -// src/vuuUIMessageTypes.ts -var isConnectionStatusMessage = (msg) => msg.type === "connection-status"; -var isConnectionQualityMetrics = (msg) => msg.type === "connection-metrics"; -var isViewporttMessage = (msg) => "viewport" in msg; -var isSessionTableActionMessage = (messageBody) => messageBody.type === "VIEW_PORT_MENU_RESP" && messageBody.action !== null && isSessionTable(messageBody.action.table); -var isSessionTable = (table) => { - if (table !== null && typeof table === "object" && "table" in table && "module" in table) { - return table.table.startsWith("session"); - } - return false; -}; - -// src/server-proxy/messages.ts -var CHANGE_VP_SUCCESS = "CHANGE_VP_SUCCESS"; -var CHANGE_VP_RANGE_SUCCESS = "CHANGE_VP_RANGE_SUCCESS"; -var CLOSE_TREE_NODE = "CLOSE_TREE_NODE"; -var CLOSE_TREE_SUCCESS = "CLOSE_TREE_SUCCESS"; -var CREATE_VP = "CREATE_VP"; -var CREATE_VP_SUCCESS = "CREATE_VP_SUCCESS"; -var DISABLE_VP = "DISABLE_VP"; -var DISABLE_VP_SUCCESS = "DISABLE_VP_SUCCESS"; -var ENABLE_VP = "ENABLE_VP"; -var ENABLE_VP_SUCCESS = "ENABLE_VP_SUCCESS"; -var GET_VP_VISUAL_LINKS = "GET_VP_VISUAL_LINKS"; -var GET_VIEW_PORT_MENUS = "GET_VIEW_PORT_MENUS"; -var HB = "HB"; -var HB_RESP = "HB_RESP"; -var LOGIN = "LOGIN"; -var LOGIN_SUCCESS = "LOGIN_SUCCESS"; -var OPEN_TREE_NODE = "OPEN_TREE_NODE"; -var OPEN_TREE_SUCCESS = "OPEN_TREE_SUCCESS"; -var REMOVE_VP = "REMOVE_VP"; -var RPC_RESP = "RPC_RESP"; -var SET_SELECTION_SUCCESS = "SET_SELECTION_SUCCESS"; -var TABLE_META_RESP = "TABLE_META_RESP"; -var TABLE_LIST_RESP = "TABLE_LIST_RESP"; -var TABLE_ROW = "TABLE_ROW"; - -// src/server-proxy/rpc-services.ts -var getRpcServiceModule = (service) => { - switch (service) { - case "TypeAheadRpcHandler": - return "TYPEAHEAD"; - default: - return "SIMUL"; - } -}; - -// src/server-proxy/array-backed-moving-window.ts -var EMPTY_ARRAY = []; -var log = logger("array-backed-moving-window"); -function dataIsUnchanged(newRow, existingRow) { - if (!existingRow) { - return false; - } - if (existingRow.data.length !== newRow.data.length) { - return false; - } - if (existingRow.sel !== newRow.sel) { - return false; - } - for (let i = 0; i < existingRow.data.length; i++) { - if (existingRow.data[i] !== newRow.data[i]) { - return false; - } - } - return true; -} -var _range; -var ArrayBackedMovingWindow = class { - // Note, the buffer is already accounted for in the range passed in here - constructor({ from: clientFrom, to: clientTo }, { from, to }, bufferSize) { - __privateAdd(this, _range, void 0); - this.setRowCount = (rowCount) => { - var _a; - (_a = log.info) == null ? void 0 : _a.call(log, \`setRowCount \${rowCount}\`); - if (rowCount < this.internalData.length) { - this.internalData.length = rowCount; - } - if (rowCount < this.rowCount) { - this.rowsWithinRange = 0; - const end = Math.min(rowCount, this.clientRange.to); - for (let i = this.clientRange.from; i < end; i++) { - const rowIndex = i - __privateGet(this, _range).from; - if (this.internalData[rowIndex] !== void 0) { - this.rowsWithinRange += 1; - } - } - } - this.rowCount = rowCount; - }; - this.bufferBreakout = (from, to) => { - const bufferPerimeter = this.bufferSize * 0.25; - if (__privateGet(this, _range).to - to < bufferPerimeter) { - return true; - } else if (__privateGet(this, _range).from > 0 && from - __privateGet(this, _range).from < bufferPerimeter) { - return true; - } else { - return false; - } - }; - this.bufferSize = bufferSize; - this.clientRange = new WindowRange(clientFrom, clientTo); - __privateSet(this, _range, new WindowRange(from, to)); - this.internalData = new Array(bufferSize); - this.rowsWithinRange = 0; - this.rowCount = 0; - } - get range() { - return __privateGet(this, _range); - } - // TODO we shpuld probably have a hasAllClientRowsWithinRange - get hasAllRowsWithinRange() { - return this.rowsWithinRange === this.clientRange.to - this.clientRange.from || // this.rowsWithinRange === this.range.to - this.range.from || - this.rowCount > 0 && this.clientRange.from + this.rowsWithinRange === this.rowCount; - } - // Check to see if set of rows is outside the current viewport range, indicating - // that veiwport is being scrolled quickly and server is not able to keep up. - outOfRange(firstIndex, lastIndex) { - const { from, to } = this.range; - if (lastIndex < from) { - return true; - } - if (firstIndex >= to) { - return true; - } - } - setAtIndex(row) { - const { rowIndex: index } = row; - const internalIndex = index - __privateGet(this, _range).from; - if (dataIsUnchanged(row, this.internalData[internalIndex])) { - return false; - } - const isWithinClientRange = this.isWithinClientRange(index); - if (isWithinClientRange || this.isWithinRange(index)) { - if (!this.internalData[internalIndex] && isWithinClientRange) { - this.rowsWithinRange += 1; - } - this.internalData[internalIndex] = row; - } - return isWithinClientRange; - } - getAtIndex(index) { - return __privateGet(this, _range).isWithin(index) && this.internalData[index - __privateGet(this, _range).from] != null ? this.internalData[index - __privateGet(this, _range).from] : void 0; - } - isWithinRange(index) { - return __privateGet(this, _range).isWithin(index); - } - isWithinClientRange(index) { - return this.clientRange.isWithin(index); - } - // Returns [false] or [serverDataRequired, clientRows, holdingRows] - setClientRange(from, to) { - var _a; - (_a = log.debug) == null ? void 0 : _a.call(log, \`setClientRange \${from} - \${to}\`); - const currentFrom = this.clientRange.from; - const currentTo = Math.min(this.clientRange.to, this.rowCount); - if (from === currentFrom && to === currentTo) { - return [ - false, - EMPTY_ARRAY - /*, EMPTY_ARRAY*/ - ]; - } - const originalRange = this.clientRange.copy(); - this.clientRange.from = from; - this.clientRange.to = to; - this.rowsWithinRange = 0; - for (let i = from; i < to; i++) { - const internalIndex = i - __privateGet(this, _range).from; - if (this.internalData[internalIndex]) { - this.rowsWithinRange += 1; - } - } - let clientRows = EMPTY_ARRAY; - const offset = __privateGet(this, _range).from; - if (this.hasAllRowsWithinRange) { - if (to > originalRange.to) { - const start = Math.max(from, originalRange.to); - clientRows = this.internalData.slice(start - offset, to - offset); - } else { - const end = Math.min(originalRange.from, to); - clientRows = this.internalData.slice(from - offset, end - offset); - } - } - const serverDataRequired = this.bufferBreakout(from, to); - return [serverDataRequired, clientRows]; - } - setRange(from, to) { - var _a, _b; - if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) { - (_a = log.debug) == null ? void 0 : _a.call(log, \`setRange \${from} - \${to}\`); - const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to); - const newData = new Array(to - from); - this.rowsWithinRange = 0; - for (let i = overlapFrom; i < overlapTo; i++) { - const data = this.getAtIndex(i); - if (data) { - const index = i - from; - newData[index] = data; - if (this.isWithinClientRange(i)) { - this.rowsWithinRange += 1; - } - } - } - this.internalData = newData; - __privateGet(this, _range).from = from; - __privateGet(this, _range).to = to; - } else { - (_b = log.debug) == null ? void 0 : _b.call(log, \`setRange \${from} - \${to} IGNORED because not changed\`); - } - } - //TODO temp - get data() { - return this.internalData; - } - getData() { - var _a; - const { from, to } = __privateGet(this, _range); - const { from: clientFrom, to: clientTo } = this.clientRange; - const startOffset = Math.max(0, clientFrom - from); - const endOffset = Math.min( - to - from, - to, - clientTo - from, - (_a = this.rowCount) != null ? _a : to - ); - return this.internalData.slice(startOffset, endOffset); - } - clear() { - var _a; - (_a = log.debug) == null ? void 0 : _a.call(log, "clear"); - this.internalData.length = 0; - this.rowsWithinRange = 0; - this.setRowCount(0); - } - // used only for debugging - getCurrentDataRange() { - const rows = this.internalData; - const len = rows.length; - let [firstRow] = this.internalData; - let lastRow = this.internalData[len - 1]; - if (firstRow && lastRow) { - return [firstRow.rowIndex, lastRow.rowIndex]; - } else { - for (let i = 0; i < len; i++) { - if (rows[i] !== void 0) { - firstRow = rows[i]; - break; - } - } - for (let i = len - 1; i >= 0; i--) { - if (rows[i] !== void 0) { - lastRow = rows[i]; - break; - } - } - if (firstRow && lastRow) { - return [firstRow.rowIndex, lastRow.rowIndex]; - } else { - return [-1, -1]; - } - } - } -}; -_range = new WeakMap(); - -// src/server-proxy/viewport.ts -var EMPTY_GROUPBY = []; -var { debug: debug3, debugEnabled: debugEnabled3, error: error2, info: info2, infoEnabled: infoEnabled2, warn: warn2 } = logger("viewport"); -var isLeafUpdate = ({ rowKey, updateType }) => updateType === "U" && !rowKey.startsWith("\$root"); -var NO_DATA_UPDATE = [ - void 0, - void 0 -]; -var NO_UPDATE_STATUS = { - count: 0, - mode: void 0, - size: 0, - ts: 0 -}; -var Viewport = class { - constructor({ - aggregations, - bufferSize = 50, - columns, - filter, - groupBy = [], - table, - range, - sort, - title, - viewport, - visualLink - }, postMessageToClient) { - /** batchMode is irrelevant for Vuu Table, it was introduced to try and improve rendering performance of AgGrid */ - this.batchMode = true; - this.hasUpdates = false; - this.pendingUpdates = []; - this.pendingOperations = /* @__PURE__ */ new Map(); - this.pendingRangeRequests = []; - this.rowCountChanged = false; - this.selectedRows = []; - this.tableSchema = null; - this.useBatchMode = true; - this.lastUpdateStatus = NO_UPDATE_STATUS; - this.updateThrottleTimer = void 0; - this.rangeMonitor = new RangeMonitor("ViewPort"); - this.disabled = false; - this.isTree = false; - // TODO roll disabled/suspended into status - this.status = ""; - this.suspended = false; - this.suspendTimer = null; - // Records SIZE only updates - this.setLastSizeOnlyUpdateSize = (size) => { - this.lastUpdateStatus.size = size; - }; - this.setLastUpdate = (mode) => { - const { ts: lastTS, mode: lastMode } = this.lastUpdateStatus; - let elapsedTime = 0; - if (lastMode === mode) { - const ts = Date.now(); - this.lastUpdateStatus.count += 1; - this.lastUpdateStatus.ts = ts; - elapsedTime = lastTS === 0 ? 0 : ts - lastTS; - } else { - this.lastUpdateStatus.count = 1; - this.lastUpdateStatus.ts = 0; - elapsedTime = 0; - } - this.lastUpdateStatus.mode = mode; - return elapsedTime; - }; - this.rangeRequestAlreadyPending = (range) => { - const { bufferSize } = this; - const bufferThreshold = bufferSize * 0.25; - let { from: stillPendingFrom } = range; - for (const { from, to } of this.pendingRangeRequests) { - if (stillPendingFrom >= from && stillPendingFrom < to) { - if (range.to + bufferThreshold <= to) { - return true; - } else { - stillPendingFrom = to; - } - } - } - return false; - }; - this.sendThrottledSizeMessage = () => { - this.updateThrottleTimer = void 0; - this.lastUpdateStatus.count = 3; - this.postMessageToClient({ - clientViewportId: this.clientViewportId, - mode: "size-only", - size: this.lastUpdateStatus.size, - type: "viewport-update" - }); - }; - // If we are receiving multiple SIZE updates but no data, table is loading rows - // outside of our viewport. We can safely throttle these requests. Doing so will - // alleviate pressure on UI DataTable. - this.shouldThrottleMessage = (mode) => { - const elapsedTime = this.setLastUpdate(mode); - return mode === "size-only" && elapsedTime > 0 && elapsedTime < 500 && this.lastUpdateStatus.count > 3; - }; - this.throttleMessage = (mode) => { - if (this.shouldThrottleMessage(mode)) { - info2 == null ? void 0 : info2("throttling updates setTimeout to 2000"); - if (this.updateThrottleTimer === void 0) { - this.updateThrottleTimer = setTimeout( - this.sendThrottledSizeMessage, - 2e3 - ); - } - return true; - } else if (this.updateThrottleTimer !== void 0) { - clearTimeout(this.updateThrottleTimer); - this.updateThrottleTimer = void 0; - } - return false; - }; - this.getNewRowCount = () => { - if (this.rowCountChanged && this.dataWindow) { - this.rowCountChanged = false; - return this.dataWindow.rowCount; - } - }; - this.aggregations = aggregations; - this.bufferSize = bufferSize; - this.clientRange = range; - this.clientViewportId = viewport; - this.columns = columns; - this.filter = filter; - this.groupBy = groupBy; - this.keys = new KeySet(range); - this.pendingLinkedParent = visualLink; - this.table = table; - this.sort = sort; - this.title = title; - infoEnabled2 && (info2 == null ? void 0 : info2( - \`constructor #\${viewport} \${table.table} bufferSize=\${bufferSize}\` - )); - this.dataWindow = new ArrayBackedMovingWindow( - this.clientRange, - range, - this.bufferSize - ); - this.postMessageToClient = postMessageToClient; - } - get hasUpdatesToProcess() { - if (this.suspended) { - return false; - } - return this.rowCountChanged || this.hasUpdates; - } - get size() { - var _a; - return (_a = this.dataWindow.rowCount) != null ? _a : 0; - } - subscribe() { - const { filter } = this.filter; - this.status = this.status === "subscribed" ? "resubscribing" : "subscribing"; - return { - type: CREATE_VP, - table: this.table, - range: getFullRange(this.clientRange, this.bufferSize), - aggregations: this.aggregations, - columns: this.columns, - sort: this.sort, - groupBy: this.groupBy, - filterSpec: { filter } - }; - } - handleSubscribed({ - viewPortId, - aggregations, - columns, - filterSpec: filter, - range, - sort, - groupBy - }) { - this.serverViewportId = viewPortId; - this.status = "subscribed"; - this.aggregations = aggregations; - this.columns = columns; - this.groupBy = groupBy; - this.isTree = groupBy && groupBy.length > 0; - this.dataWindow.setRange(range.from, range.to); - return { - aggregations, - type: "subscribed", - clientViewportId: this.clientViewportId, - columns, - filter, - groupBy, - range, - sort, - tableSchema: this.tableSchema - }; - } - awaitOperation(requestId, msg) { - this.pendingOperations.set(requestId, msg); - } - // Return a message if we need to communicate this to client UI - completeOperation(requestId, ...params) { - var _a; - const { clientViewportId, pendingOperations } = this; - const pendingOperation = pendingOperations.get(requestId); - if (!pendingOperation) { - error2("no matching operation found to complete"); - return; - } - const { type } = pendingOperation; - info2 == null ? void 0 : info2(\`completeOperation \${type}\`); - pendingOperations.delete(requestId); - if (type === "CHANGE_VP_RANGE") { - const [from, to] = params; - (_a = this.dataWindow) == null ? void 0 : _a.setRange(from, to); - for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) { - const pendingRangeRequest = this.pendingRangeRequests[i]; - if (pendingRangeRequest.requestId === requestId) { - pendingRangeRequest.acked = true; - break; - } else { - warn2 == null ? void 0 : warn2("range requests sent faster than they are being ACKed"); - } - } - } else if (type === "config") { - const { aggregations, columns, filter, groupBy, sort } = pendingOperation.data; - this.aggregations = aggregations; - this.columns = columns; - this.filter = filter; - this.groupBy = groupBy; - this.sort = sort; - if (groupBy.length > 0) { - this.isTree = true; - } else if (this.isTree) { - this.isTree = false; - } - debug3 == null ? void 0 : debug3(\`config change confirmed, isTree : \${this.isTree}\`); - return { - clientViewportId, - type, - config: pendingOperation.data - }; - } else if (type === "groupBy") { - this.isTree = pendingOperation.data.length > 0; - this.groupBy = pendingOperation.data; - debug3 == null ? void 0 : debug3(\`groupBy change confirmed, isTree : \${this.isTree}\`); - return { - clientViewportId, - type, - groupBy: pendingOperation.data - }; - } else if (type === "columns") { - this.columns = pendingOperation.data; - return { - clientViewportId, - type, - columns: pendingOperation.data - }; - } else if (type === "filter") { - this.filter = pendingOperation.data; - return { - clientViewportId, - type, - filter: pendingOperation.data - }; - } else if (type === "aggregate") { - this.aggregations = pendingOperation.data; - return { - clientViewportId, - type: "aggregate", - aggregations: this.aggregations - }; - } else if (type === "sort") { - this.sort = pendingOperation.data; - return { - clientViewportId, - type, - sort: this.sort - }; - } else if (type === "selection") { - } else if (type === "disable") { - this.disabled = true; - return { - type: "disabled", - clientViewportId - }; - } else if (type === "enable") { - this.disabled = false; - return { - type: "enabled", - clientViewportId - }; - } else if (type === "CREATE_VISUAL_LINK") { - const [colName, parentViewportId, parentColName] = params; - this.linkedParent = { - colName, - parentViewportId, - parentColName - }; - this.pendingLinkedParent = void 0; - return { - type: "vuu-link-created", - clientViewportId, - colName, - parentViewportId, - parentColName - }; - } else if (type === "REMOVE_VISUAL_LINK") { - this.linkedParent = void 0; - return { - type: "vuu-link-removed", - clientViewportId - }; - } - } - // TODO when a range request arrives, consider the viewport to be scrolling - // until data arrives and we have the full range. - // When not scrolling, any server data is an update - // When scrolling, we are in batch mode - rangeRequest(requestId, range) { - if (debugEnabled3) { - this.rangeMonitor.set(range); - } - const type = "CHANGE_VP_RANGE"; - if (this.dataWindow) { - const [serverDataRequired, clientRows] = this.dataWindow.setClientRange( - range.from, - range.to - ); - let debounceRequest; - const maxRange = this.dataWindow.rowCount || void 0; - const serverRequest = serverDataRequired && !this.rangeRequestAlreadyPending(range) ? { - type, - viewPortId: this.serverViewportId, - ...getFullRange(range, this.bufferSize, maxRange) - } : null; - if (serverRequest) { - debugEnabled3 && (debug3 == null ? void 0 : debug3( - \`create CHANGE_VP_RANGE: [\${serverRequest.from} - \${serverRequest.to}]\` - )); - this.awaitOperation(requestId, { type }); - const pendingRequest = this.pendingRangeRequests.at(-1); - if (pendingRequest) { - if (pendingRequest.acked) { - console.warn("Range Request before previous request is filled"); - } else { - const { from, to } = pendingRequest; - if (this.dataWindow.outOfRange(from, to)) { - debounceRequest = { - clientViewportId: this.clientViewportId, - type: "debounce-begin" - }; - } else { - warn2 == null ? void 0 : warn2("Range Request before previous request is acked"); - } - } - } - this.pendingRangeRequests.push({ ...serverRequest, requestId }); - if (this.useBatchMode) { - this.batchMode = true; - } - } else if (clientRows.length > 0) { - this.batchMode = false; - } - this.keys.reset(this.dataWindow.clientRange); - const toClient = this.isTree ? toClientRowTree : toClientRow; - if (clientRows.length) { - return [ - serverRequest, - clientRows.map((row) => { - return toClient(row, this.keys, this.selectedRows); - }) - ]; - } else if (debounceRequest) { - return [serverRequest, void 0, debounceRequest]; - } else { - return [serverRequest]; - } - } else { - return [null]; - } - } - setLinks(links) { - this.links = links; - return [ - { - type: "vuu-links", - links, - clientViewportId: this.clientViewportId - }, - this.pendingLinkedParent - ]; - } - setMenu(menu) { - return { - type: "vuu-menu", - menu, - clientViewportId: this.clientViewportId - }; - } - setTableSchema(tableSchema) { - this.tableSchema = tableSchema; - } - openTreeNode(requestId, message) { - if (this.useBatchMode) { - this.batchMode = true; - } - return { - type: OPEN_TREE_NODE, - vpId: this.serverViewportId, - treeKey: message.key - }; - } - closeTreeNode(requestId, message) { - if (this.useBatchMode) { - this.batchMode = true; - } - return { - type: CLOSE_TREE_NODE, - vpId: this.serverViewportId, - treeKey: message.key - }; - } - createLink(requestId, colName, parentVpId, parentColumnName) { - const message = { - type: "CREATE_VISUAL_LINK", - parentVpId, - childVpId: this.serverViewportId, - parentColumnName, - childColumnName: colName - }; - this.awaitOperation(requestId, message); - if (this.useBatchMode) { - this.batchMode = true; - } - return message; - } - removeLink(requestId) { - const message = { - type: "REMOVE_VISUAL_LINK", - childVpId: this.serverViewportId - }; - this.awaitOperation(requestId, message); - return message; - } - suspend() { - this.suspended = true; - info2 == null ? void 0 : info2("suspend"); - } - resume() { - this.suspended = false; - if (debugEnabled3) { - debug3 == null ? void 0 : debug3(\`resume: \${this.currentData()}\`); - } - return this.currentData(); - } - currentData() { - const out = []; - if (this.dataWindow) { - const records = this.dataWindow.getData(); - const { keys } = this; - const toClient = this.isTree ? toClientRowTree : toClientRow; - for (const row of records) { - if (row) { - out.push(toClient(row, keys, this.selectedRows)); - } - } - } - return out; - } - enable(requestId) { - this.awaitOperation(requestId, { type: "enable" }); - info2 == null ? void 0 : info2(\`enable: \${this.serverViewportId}\`); - return { - type: ENABLE_VP, - viewPortId: this.serverViewportId - }; - } - disable(requestId) { - this.awaitOperation(requestId, { type: "disable" }); - info2 == null ? void 0 : info2(\`disable: \${this.serverViewportId}\`); - this.suspended = false; - return { - type: DISABLE_VP, - viewPortId: this.serverViewportId - }; - } - columnRequest(requestId, columns) { - this.awaitOperation(requestId, { - type: "columns", - data: columns - }); - debug3 == null ? void 0 : debug3(\`columnRequest: \${columns}\`); - return this.createRequest({ columns }); - } - filterRequest(requestId, dataSourceFilter) { - this.awaitOperation(requestId, { - type: "filter", - data: dataSourceFilter - }); - if (this.useBatchMode) { - this.batchMode = true; - } - const { filter } = dataSourceFilter; - info2 == null ? void 0 : info2(\`filterRequest: \${filter}\`); - return this.createRequest({ filterSpec: { filter } }); - } - setConfig(requestId, config) { - this.awaitOperation(requestId, { type: "config", data: config }); - const { filter, ...remainingConfig } = config; - if (this.useBatchMode) { - this.batchMode = true; - } - debugEnabled3 ? debug3 == null ? void 0 : debug3(\`setConfig \${JSON.stringify(config)}\`) : info2 == null ? void 0 : info2(\`setConfig\`); - return this.createRequest( - { - ...remainingConfig, - filterSpec: typeof (filter == null ? void 0 : filter.filter) === "string" ? { - filter: filter.filter - } : { - filter: "" - } - }, - true - ); - } - aggregateRequest(requestId, aggregations) { - this.awaitOperation(requestId, { type: "aggregate", data: aggregations }); - info2 == null ? void 0 : info2(\`aggregateRequest: \${aggregations}\`); - return this.createRequest({ aggregations }); - } - sortRequest(requestId, sort) { - this.awaitOperation(requestId, { type: "sort", data: sort }); - info2 == null ? void 0 : info2(\`sortRequest: \${JSON.stringify(sort.sortDefs)}\`); - return this.createRequest({ sort }); - } - groupByRequest(requestId, groupBy = EMPTY_GROUPBY) { - var _a; - this.awaitOperation(requestId, { type: "groupBy", data: groupBy }); - if (this.useBatchMode) { - this.batchMode = true; - } - if (!this.isTree) { - (_a = this.dataWindow) == null ? void 0 : _a.clear(); - } - return this.createRequest({ groupBy }); - } - selectRequest(requestId, selected) { - this.selectedRows = selected; - this.awaitOperation(requestId, { type: "selection", data: selected }); - info2 == null ? void 0 : info2(\`selectRequest: \${selected}\`); - return { - type: "SET_SELECTION", - vpId: this.serverViewportId, - selection: expandSelection(selected) - }; - } - removePendingRangeRequest(firstIndex, lastIndex) { - for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) { - const { from, to } = this.pendingRangeRequests[i]; - let isLast = true; - if (firstIndex >= from && firstIndex < to || lastIndex > from && lastIndex < to) { - if (!isLast) { - console.warn( - "removePendingRangeRequest TABLE_ROWS are not for latest request" - ); - } - this.pendingRangeRequests.splice(i, 1); - break; - } else { - isLast = false; - } - } - } - updateRows(rows) { - var _a, _b, _c; - const [firstRow, lastRow] = getFirstAndLastRows(rows); - if (firstRow && lastRow) { - this.removePendingRangeRequest(firstRow.rowIndex, lastRow.rowIndex); - } - if (rows.length === 1) { - if (firstRow.vpSize === 0 && this.disabled) { - debug3 == null ? void 0 : debug3( - \`ignore a SIZE=0 message on disabled viewport (\${rows.length} rows)\` - ); - return; - } else if (firstRow.updateType === "SIZE") { - this.setLastSizeOnlyUpdateSize(firstRow.vpSize); - } - } - for (const row of rows) { - if (this.isTree && isLeafUpdate(row)) { - continue; - } else { - if (row.updateType === "SIZE" || ((_a = this.dataWindow) == null ? void 0 : _a.rowCount) !== row.vpSize) { - (_b = this.dataWindow) == null ? void 0 : _b.setRowCount(row.vpSize); - this.rowCountChanged = true; - } - if (row.updateType === "U") { - if ((_c = this.dataWindow) == null ? void 0 : _c.setAtIndex(row)) { - this.hasUpdates = true; - if (!this.batchMode) { - this.pendingUpdates.push(row); - } - } - } - } - } - } - // This is called only after new data has been received from server - data - // returned direcly from buffer does not use this. - getClientRows() { - let out = void 0; - let mode = "size-only"; - if (!this.hasUpdates && !this.rowCountChanged) { - return NO_DATA_UPDATE; - } - if (this.hasUpdates) { - const { keys, selectedRows } = this; - const toClient = this.isTree ? toClientRowTree : toClientRow; - if (this.updateThrottleTimer) { - self.clearTimeout(this.updateThrottleTimer); - this.updateThrottleTimer = void 0; - } - if (this.pendingUpdates.length > 0) { - out = []; - mode = "update"; - for (const row of this.pendingUpdates) { - out.push(toClient(row, keys, selectedRows)); - } - this.pendingUpdates.length = 0; - } else { - const records = this.dataWindow.getData(); - if (this.dataWindow.hasAllRowsWithinRange) { - out = []; - mode = "batch"; - for (const row of records) { - out.push(toClient(row, keys, selectedRows)); - } - this.batchMode = false; - } - } - this.hasUpdates = false; - } - if (this.throttleMessage(mode)) { - return NO_DATA_UPDATE; - } else { - return [out, mode]; - } - } - createRequest(params, overWrite = false) { - if (overWrite) { - return { - type: "CHANGE_VP", - viewPortId: this.serverViewportId, - ...params - }; - } else { - return { - type: "CHANGE_VP", - viewPortId: this.serverViewportId, - aggregations: this.aggregations, - columns: this.columns, - sort: this.sort, - groupBy: this.groupBy, - filterSpec: { - filter: this.filter.filter - }, - ...params - }; - } - } -}; -var toClientRow = ({ rowIndex, rowKey, sel: isSelected, data }, keys, selectedRows) => { - return [ - rowIndex, - keys.keyFor(rowIndex), - true, - false, - 0, - 0, - rowKey, - isSelected ? getSelectionStatus(selectedRows, rowIndex) : 0 - ].concat(data); -}; -var toClientRowTree = ({ rowIndex, rowKey, sel: isSelected, data }, keys, selectedRows) => { - const [depth, isExpanded, , isLeaf, , count, ...rest] = data; - return [ - rowIndex, - keys.keyFor(rowIndex), - isLeaf, - isExpanded, - depth, - count, - rowKey, - isSelected ? getSelectionStatus(selectedRows, rowIndex) : 0 - ].concat(rest); -}; - -// src/server-proxy/server-proxy.ts -var _requestId = 1; -var { debug: debug4, debugEnabled: debugEnabled4, error: error3, info: info3, infoEnabled: infoEnabled3, warn: warn3 } = logger("server-proxy"); -var nextRequestId = () => \`\${_requestId++}\`; -var DEFAULT_OPTIONS = {}; -var isActiveViewport = (viewPort) => viewPort.disabled !== true && viewPort.suspended !== true; -var NO_ACTION = { - type: "NO_ACTION" -}; -var addTitleToLinks = (links, serverViewportId, label) => links.map( - (link) => link.parentVpId === serverViewportId ? { ...link, label } : link -); -function addLabelsToLinks(links, viewports) { - return links.map((linkDescriptor) => { - const { parentVpId } = linkDescriptor; - const viewport = viewports.get(parentVpId); - if (viewport) { - return { - ...linkDescriptor, - parentClientVpId: viewport.clientViewportId, - label: viewport.title - }; - } else { - throw Error("addLabelsToLinks viewport not found"); - } - }); -} -var ServerProxy = class { - constructor(connection, callback) { - this.authToken = ""; - this.user = "user"; - this.pendingTableMetaRequests = /* @__PURE__ */ new Map(); - this.pendingRequests = /* @__PURE__ */ new Map(); - this.queuedRequests = []; - this.cachedTableSchemas = /* @__PURE__ */ new Map(); - this.connection = connection; - this.postMessageToClient = callback; - this.viewports = /* @__PURE__ */ new Map(); - this.mapClientToServerViewport = /* @__PURE__ */ new Map(); - } - async reconnect() { - await this.login(this.authToken); - const [activeViewports, inactiveViewports] = partition( - Array.from(this.viewports.values()), - isActiveViewport - ); - this.viewports.clear(); - this.mapClientToServerViewport.clear(); - const reconnectViewports = (viewports) => { - viewports.forEach((viewport) => { - const { clientViewportId } = viewport; - this.viewports.set(clientViewportId, viewport); - this.sendMessageToServer(viewport.subscribe(), clientViewportId); - }); - }; - reconnectViewports(activeViewports); - setTimeout(() => { - reconnectViewports(inactiveViewports); - }, 2e3); - } - async login(authToken, user = "user") { - if (authToken) { - this.authToken = authToken; - this.user = user; - return new Promise((resolve, reject) => { - this.sendMessageToServer( - { type: LOGIN, token: this.authToken, user }, - "" - ); - this.pendingLogin = { resolve, reject }; - }); - } else if (this.authToken === "") { - error3("login, cannot login until auth token has been obtained"); - } - } - subscribe(message) { - if (!this.mapClientToServerViewport.has(message.viewport)) { - if (!this.hasSchemaForTable(message.table) && // A Session table is never cached - it is limited to a single workflow interaction - // The metadata for a session table is requested even before the subscribe call. - !isSessionTable(message.table)) { - info3 == null ? void 0 : info3( - \`subscribe to \${message.table.table}, no metadata yet, request metadata\` - ); - const requestId = nextRequestId(); - this.sendMessageToServer( - { type: "GET_TABLE_META", table: message.table }, - requestId - ); - this.pendingTableMetaRequests.set(requestId, message.viewport); - } - const viewport = new Viewport(message, this.postMessageToClient); - this.viewports.set(message.viewport, viewport); - this.sendIfReady( - viewport.subscribe(), - message.viewport, - this.sessionId !== "" - ); - } else { - error3(\`spurious subscribe call \${message.viewport}\`); - } - } - unsubscribe(clientViewportId) { - const serverViewportId = this.mapClientToServerViewport.get(clientViewportId); - if (serverViewportId) { - info3 == null ? void 0 : info3( - \`Unsubscribe Message (Client to Server): - \${serverViewportId}\` - ); - this.sendMessageToServer({ - type: REMOVE_VP, - viewPortId: serverViewportId - }); - } else { - error3( - \`failed to unsubscribe client viewport \${clientViewportId}, viewport not found\` - ); - } - } - getViewportForClient(clientViewportId, throws = true) { - const serverViewportId = this.mapClientToServerViewport.get(clientViewportId); - if (serverViewportId) { - const viewport = this.viewports.get(serverViewportId); - if (viewport) { - return viewport; - } else if (throws) { - throw Error( - \`Viewport not found for client viewport \${clientViewportId}\` - ); - } else { - return null; - } - } else if (this.viewports.has(clientViewportId)) { - return this.viewports.get(clientViewportId); - } else if (throws) { - throw Error( - \`Viewport server id not found for client viewport \${clientViewportId}\` - ); - } else { - return null; - } - } - /**********************************************************************/ - /* Handle messages from client */ - /**********************************************************************/ - setViewRange(viewport, message) { - const requestId = nextRequestId(); - const [serverRequest, rows, debounceRequest] = viewport.rangeRequest( - requestId, - message.range - ); - info3 == null ? void 0 : info3(\`setViewRange \${message.range.from} - \${message.range.to}\`); - if (serverRequest) { - if (true) { - info3 == null ? void 0 : info3( - \`CHANGE_VP_RANGE [\${message.range.from}-\${message.range.to}] => [\${serverRequest.from}-\${serverRequest.to}]\` - ); - } - this.sendIfReady( - serverRequest, - requestId, - viewport.status === "subscribed" - ); - } - if (rows) { - info3 == null ? void 0 : info3(\`setViewRange \${rows.length} rows returned from cache\`); - this.postMessageToClient({ - mode: "batch", - type: "viewport-update", - clientViewportId: viewport.clientViewportId, - rows - }); - } else if (debounceRequest) { - this.postMessageToClient(debounceRequest); - } - } - setConfig(viewport, message) { - const requestId = nextRequestId(); - const request = viewport.setConfig(requestId, message.config); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - aggregate(viewport, message) { - const requestId = nextRequestId(); - const request = viewport.aggregateRequest(requestId, message.aggregations); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - sort(viewport, message) { - const requestId = nextRequestId(); - const request = viewport.sortRequest(requestId, message.sort); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - groupBy(viewport, message) { - const requestId = nextRequestId(); - const request = viewport.groupByRequest(requestId, message.groupBy); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - filter(viewport, message) { - const requestId = nextRequestId(); - const { filter } = message; - const request = viewport.filterRequest(requestId, filter); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - setColumns(viewport, message) { - const requestId = nextRequestId(); - const { columns } = message; - const request = viewport.columnRequest(requestId, columns); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - setTitle(viewport, message) { - if (viewport) { - viewport.title = message.title; - this.updateTitleOnVisualLinks(viewport); - } - } - select(viewport, message) { - const requestId = nextRequestId(); - const { selected } = message; - const request = viewport.selectRequest(requestId, selected); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - disableViewport(viewport) { - const requestId = nextRequestId(); - const request = viewport.disable(requestId); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - enableViewport(viewport) { - if (viewport.disabled) { - const requestId = nextRequestId(); - const request = viewport.enable(requestId); - this.sendIfReady(request, requestId, viewport.status === "subscribed"); - } - } - suspendViewport(viewport) { - viewport.suspend(); - viewport.suspendTimer = setTimeout(() => { - info3 == null ? void 0 : info3("suspendTimer expired, escalate suspend to disable"); - this.disableViewport(viewport); - }, 3e3); - } - resumeViewport(viewport) { - if (viewport.suspendTimer) { - debug4 == null ? void 0 : debug4("clear suspend timer"); - clearTimeout(viewport.suspendTimer); - viewport.suspendTimer = null; - } - const rows = viewport.resume(); - this.postMessageToClient({ - clientViewportId: viewport.clientViewportId, - mode: "batch", - rows, - type: "viewport-update" - }); - } - openTreeNode(viewport, message) { - if (viewport.serverViewportId) { - const requestId = nextRequestId(); - this.sendIfReady( - viewport.openTreeNode(requestId, message), - requestId, - viewport.status === "subscribed" - ); - } - } - closeTreeNode(viewport, message) { - if (viewport.serverViewportId) { - const requestId = nextRequestId(); - this.sendIfReady( - viewport.closeTreeNode(requestId, message), - requestId, - viewport.status === "subscribed" - ); - } - } - createLink(viewport, message) { - const { parentClientVpId, parentColumnName, childColumnName } = message; - const requestId = nextRequestId(); - const parentVpId = this.mapClientToServerViewport.get(parentClientVpId); - if (parentVpId) { - const request = viewport.createLink( - requestId, - childColumnName, - parentVpId, - parentColumnName - ); - this.sendMessageToServer(request, requestId); - } else { - error3("ServerProxy unable to create link, viewport not found"); - } - } - removeLink(viewport) { - const requestId = nextRequestId(); - const request = viewport.removeLink(requestId); - this.sendMessageToServer(request, requestId); - } - updateTitleOnVisualLinks(viewport) { - var _a; - const { serverViewportId, title } = viewport; - for (const vp of this.viewports.values()) { - if (vp !== viewport && vp.links && serverViewportId && title) { - if ((_a = vp.links) == null ? void 0 : _a.some((link) => link.parentVpId === serverViewportId)) { - const [messageToClient] = vp.setLinks( - addTitleToLinks(vp.links, serverViewportId, title) - ); - this.postMessageToClient(messageToClient); - } - } - } - } - removeViewportFromVisualLinks(serverViewportId) { - var _a; - for (const vp of this.viewports.values()) { - if ((_a = vp.links) == null ? void 0 : _a.some(({ parentVpId }) => parentVpId === serverViewportId)) { - const [messageToClient] = vp.setLinks( - vp.links.filter(({ parentVpId }) => parentVpId !== serverViewportId) - ); - this.postMessageToClient(messageToClient); - } - } - } - menuRpcCall(message) { - const viewport = this.getViewportForClient(message.vpId, false); - if (viewport == null ? void 0 : viewport.serverViewportId) { - const [requestId, rpcRequest] = stripRequestId(message); - this.sendMessageToServer( - { - ...rpcRequest, - vpId: viewport.serverViewportId - }, - requestId - ); - } - } - rpcCall(message) { - const [requestId, rpcRequest] = stripRequestId(message); - const module = getRpcServiceModule(rpcRequest.service); - this.sendMessageToServer(rpcRequest, requestId, { module }); - } - handleMessageFromClient(message) { - if (isViewporttMessage(message)) { - if (message.type === "disable") { - const viewport = this.getViewportForClient(message.viewport, false); - if (viewport !== null) { - return this.disableViewport(viewport); - } else { - return; - } - } else { - const viewport = this.getViewportForClient(message.viewport); - switch (message.type) { - case "setViewRange": - return this.setViewRange(viewport, message); - case "config": - return this.setConfig(viewport, message); - case "aggregate": - return this.aggregate(viewport, message); - case "sort": - return this.sort(viewport, message); - case "groupBy": - return this.groupBy(viewport, message); - case "filter": - return this.filter(viewport, message); - case "select": - return this.select(viewport, message); - case "suspend": - return this.suspendViewport(viewport); - case "resume": - return this.resumeViewport(viewport); - case "enable": - return this.enableViewport(viewport); - case "openTreeNode": - return this.openTreeNode(viewport, message); - case "closeTreeNode": - return this.closeTreeNode(viewport, message); - case "createLink": - return this.createLink(viewport, message); - case "removeLink": - return this.removeLink(viewport); - case "setColumns": - return this.setColumns(viewport, message); - case "setTitle": - return this.setTitle(viewport, message); - default: - } - } - } else if (isVuuMenuRpcRequest(message)) { - return this.menuRpcCall(message); - } else { - const { type, requestId } = message; - switch (type) { - case "GET_TABLE_LIST": - return this.sendMessageToServer({ type }, requestId); - case "GET_TABLE_META": - return this.sendMessageToServer( - { type, table: message.table }, - requestId - ); - case "RPC_CALL": - return this.rpcCall(message); - default: - } - } - error3( - \`Vuu ServerProxy Unexpected message from client \${JSON.stringify( - message - )}\` - ); - } - awaitResponseToMessage(message) { - return new Promise((resolve, reject) => { - const requestId = nextRequestId(); - this.sendMessageToServer(message, requestId); - this.pendingRequests.set(requestId, { reject, resolve }); - }); - } - sendIfReady(message, requestId, isReady = true) { - if (isReady) { - this.sendMessageToServer(message, requestId); - } else { - this.queuedRequests.push(message); - } - return isReady; - } - sendMessageToServer(body, requestId = \`\${_requestId++}\`, options = DEFAULT_OPTIONS) { - const { module = "CORE" } = options; - if (this.authToken) { - this.connection.send({ - requestId, - sessionId: this.sessionId, - token: this.authToken, - user: this.user, - module, - body - }); - } - } - handleMessageFromServer(message) { - var _a, _b, _c; - const { body, requestId, sessionId } = message; - const pendingRequest = this.pendingRequests.get(requestId); - if (pendingRequest) { - const { resolve } = pendingRequest; - this.pendingRequests.delete(requestId); - resolve(body); - return; - } - const { viewports } = this; - switch (body.type) { - case HB: - this.sendMessageToServer( - { type: HB_RESP, ts: +/* @__PURE__ */ new Date() }, - "NA" - ); - break; - case LOGIN_SUCCESS: - if (sessionId) { - this.sessionId = sessionId; - (_a = this.pendingLogin) == null ? void 0 : _a.resolve(sessionId); - this.pendingLogin = void 0; - } else { - throw Error("LOGIN_SUCCESS did not provide sessionId"); - } - break; - case CREATE_VP_SUCCESS: - { - const viewport = viewports.get(requestId); - if (viewport) { - const { status: viewportStatus } = viewport; - const { viewPortId: serverViewportId } = body; - if (requestId !== serverViewportId) { - viewports.delete(requestId); - viewports.set(serverViewportId, viewport); - } - this.mapClientToServerViewport.set(requestId, serverViewportId); - const response = viewport.handleSubscribed(body); - if (response) { - this.postMessageToClient(response); - if (debugEnabled4) { - debug4( - \`post DataSourceSubscribedMessage to client: \${JSON.stringify( - response - )}\` - ); - } - } - if (viewport.disabled) { - this.disableViewport(viewport); - } - if (viewportStatus === "subscribing" && // A session table will never have Visual Links, nor Context Menus - !isSessionTable(viewport.table)) { - this.sendMessageToServer({ - type: GET_VP_VISUAL_LINKS, - vpId: serverViewportId - }); - this.sendMessageToServer({ - type: GET_VIEW_PORT_MENUS, - vpId: serverViewportId - }); - Array.from(viewports.entries()).filter( - ([id, { disabled }]) => id !== serverViewportId && !disabled - ).forEach(([vpId]) => { - this.sendMessageToServer({ - type: GET_VP_VISUAL_LINKS, - vpId - }); - }); - } - } - } - break; - case "REMOVE_VP_SUCCESS": - { - const viewport = viewports.get(body.viewPortId); - if (viewport) { - this.mapClientToServerViewport.delete(viewport.clientViewportId); - viewports.delete(body.viewPortId); - this.removeViewportFromVisualLinks(body.viewPortId); - } - } - break; - case SET_SELECTION_SUCCESS: - { - const viewport = this.viewports.get(body.vpId); - if (viewport) { - viewport.completeOperation(requestId); - } - } - break; - case CHANGE_VP_SUCCESS: - case DISABLE_VP_SUCCESS: - if (viewports.has(body.viewPortId)) { - const viewport = this.viewports.get(body.viewPortId); - if (viewport) { - const response = viewport.completeOperation(requestId); - if (response !== void 0) { - this.postMessageToClient(response); - if (debugEnabled4) { - debug4(\`postMessageToClient \${JSON.stringify(response)}\`); - } - } - } - } - break; - case ENABLE_VP_SUCCESS: - { - const viewport = this.viewports.get(body.viewPortId); - if (viewport) { - const response = viewport.completeOperation(requestId); - if (response) { - this.postMessageToClient(response); - const rows = viewport.currentData(); - debugEnabled4 && debug4( - \`Enable Response (ServerProxy to Client): \${JSON.stringify( - response - )}\` - ); - if (viewport.size === 0) { - debugEnabled4 && debug4(\`Viewport Enabled but size 0, resend to server\`); - } else { - this.postMessageToClient({ - clientViewportId: viewport.clientViewportId, - mode: "batch", - rows, - size: viewport.size, - type: "viewport-update" - }); - debugEnabled4 && debug4( - \`Enable Response (ServerProxy to Client): send size \${viewport.size} \${rows.length} rows from cache\` - ); - } - } - } - } - break; - case TABLE_ROW: - { - const viewportRowMap = groupRowsByViewport(body.rows); - if (debugEnabled4) { - const [firstRow, secondRow] = body.rows; - if (body.rows.length === 0) { - debug4("handleMessageFromServer TABLE_ROW 0 rows"); - } else if ((firstRow == null ? void 0 : firstRow.rowIndex) === -1) { - if (body.rows.length === 1) { - if (firstRow.updateType === "SIZE") { - debug4( - \`handleMessageFromServer [\${firstRow.viewPortId}] TABLE_ROW SIZE ONLY \${firstRow.vpSize}\` - ); - } else { - debug4( - \`handleMessageFromServer [\${firstRow.viewPortId}] TABLE_ROW SIZE \${firstRow.vpSize} rowIdx \${firstRow.rowIndex}\` - ); - } - } else { - debug4( - \`handleMessageFromServer TABLE_ROW \${body.rows.length} rows, SIZE \${firstRow.vpSize}, [\${secondRow == null ? void 0 : secondRow.rowIndex}] - [\${(_b = body.rows[body.rows.length - 1]) == null ? void 0 : _b.rowIndex}]\` - ); - } - } else { - debug4( - \`handleMessageFromServer TABLE_ROW \${body.rows.length} rows [\${firstRow == null ? void 0 : firstRow.rowIndex}] - [\${(_c = body.rows[body.rows.length - 1]) == null ? void 0 : _c.rowIndex}]\` - ); - } - } - for (const [viewportId, rows] of Object.entries(viewportRowMap)) { - const viewport = viewports.get(viewportId); - if (viewport) { - viewport.updateRows(rows); - } else { - warn3 == null ? void 0 : warn3( - \`TABLE_ROW message received for non registered viewport \${viewportId}\` - ); - } - } - this.processUpdates(); - } - break; - case CHANGE_VP_RANGE_SUCCESS: - { - const viewport = this.viewports.get(body.viewPortId); - if (viewport) { - const { from, to } = body; - if (true) { - info3 == null ? void 0 : info3(\`CHANGE_VP_RANGE_SUCCESS \${from} - \${to}\`); - } - viewport.completeOperation(requestId, from, to); - } - } - break; - case OPEN_TREE_SUCCESS: - case CLOSE_TREE_SUCCESS: - break; - case "CREATE_VISUAL_LINK_SUCCESS": - { - const viewport = this.viewports.get(body.childVpId); - const parentViewport = this.viewports.get(body.parentVpId); - if (viewport && parentViewport) { - const { childColumnName, parentColumnName } = body; - const response = viewport.completeOperation( - requestId, - childColumnName, - parentViewport.clientViewportId, - parentColumnName - ); - if (response) { - this.postMessageToClient(response); - } - } - } - break; - case "REMOVE_VISUAL_LINK_SUCCESS": - { - const viewport = this.viewports.get(body.childVpId); - if (viewport) { - const response = viewport.completeOperation( - requestId - ); - if (response) { - this.postMessageToClient(response); - } - } - } - break; - case TABLE_LIST_RESP: - this.postMessageToClient({ - type: TABLE_LIST_RESP, - tables: body.tables, - requestId - }); - break; - case TABLE_META_RESP: - { - const tableSchema = this.cacheTableMeta(body); - const clientViewportId = this.pendingTableMetaRequests.get(requestId); - if (clientViewportId) { - this.pendingTableMetaRequests.delete(requestId); - const viewport = this.viewports.get(clientViewportId); - if (viewport) { - viewport.setTableSchema(tableSchema); - } else { - warn3 == null ? void 0 : warn3( - "Message has come back AFTER CREATE_VP_SUCCESS, what do we do now" - ); - } - } else { - this.postMessageToClient({ - type: TABLE_META_RESP, - tableSchema, - requestId - }); - } - } - break; - case "VP_VISUAL_LINKS_RESP": - { - const activeLinkDescriptors = this.getActiveLinks(body.links); - const viewport = this.viewports.get(body.vpId); - if (activeLinkDescriptors.length && viewport) { - const linkDescriptorsWithLabels = addLabelsToLinks( - activeLinkDescriptors, - this.viewports - ); - const [clientMessage, pendingLink] = viewport.setLinks( - linkDescriptorsWithLabels - ); - this.postMessageToClient(clientMessage); - if (pendingLink) { - const { link, parentClientVpId } = pendingLink; - const requestId2 = nextRequestId(); - const serverViewportId = this.mapClientToServerViewport.get(parentClientVpId); - if (serverViewportId) { - const message2 = viewport.createLink( - requestId2, - link.fromColumn, - serverViewportId, - link.toColumn - ); - this.sendMessageToServer(message2, requestId2); - } - } - } - } - break; - case "VIEW_PORT_MENUS_RESP": - if (body.menu.name) { - const viewport = this.viewports.get(body.vpId); - if (viewport) { - const clientMessage = viewport.setMenu(body.menu); - this.postMessageToClient(clientMessage); - } - } - break; - case "VP_EDIT_RPC_RESPONSE": - { - this.postMessageToClient({ - action: body.action, - requestId, - rpcName: body.rpcName, - type: "VP_EDIT_RPC_RESPONSE" - }); - } - break; - case "VP_EDIT_RPC_REJECT": - { - const viewport = this.viewports.get(body.vpId); - if (viewport) { - this.postMessageToClient({ - requestId, - type: "VP_EDIT_RPC_REJECT", - error: body.error - }); - } - } - break; - case "VIEW_PORT_MENU_REJ": { - console.log(\`send menu error back to client\`); - const { error: error4, rpcName, vpId } = body; - const viewport = this.viewports.get(vpId); - if (viewport) { - this.postMessageToClient({ - clientViewportId: viewport.clientViewportId, - error: error4, - rpcName, - type: "VIEW_PORT_MENU_REJ", - requestId - }); - } - break; - } - case "VIEW_PORT_MENU_RESP": - { - if (isSessionTableActionMessage(body)) { - const { action, rpcName } = body; - this.awaitResponseToMessage({ - type: "GET_TABLE_META", - table: action.table - }).then((response) => { - const tableSchema = createSchemaFromTableMetadata( - response - ); - this.postMessageToClient({ - rpcName, - type: "VIEW_PORT_MENU_RESP", - action: { - ...action, - tableSchema - }, - tableAlreadyOpen: this.isTableOpen(action.table), - requestId - }); - }); - } else { - const { action } = body; - this.postMessageToClient({ - type: "VIEW_PORT_MENU_RESP", - action: action || NO_ACTION, - tableAlreadyOpen: action !== null && this.isTableOpen(action.table), - requestId - }); - } - } - break; - case RPC_RESP: - { - const { method, result } = body; - this.postMessageToClient({ - type: RPC_RESP, - method, - result, - requestId - }); - } - break; - case "ERROR": - error3(body.msg); - break; - default: - infoEnabled3 && info3(\`handleMessageFromServer \${body["type"]}.\`); - } - } - hasSchemaForTable(table) { - return this.cachedTableSchemas.has(\`\${table.module}:\${table.table}\`); - } - cacheTableMeta(messageBody) { - const { module, table } = messageBody.table; - const key = \`\${module}:\${table}\`; - let tableSchema = this.cachedTableSchemas.get(key); - if (!tableSchema) { - tableSchema = createSchemaFromTableMetadata(messageBody); - this.cachedTableSchemas.set(key, tableSchema); - } - return tableSchema; - } - isTableOpen(table) { - if (table) { - const tableName = table.table; - for (const viewport of this.viewports.values()) { - if (!viewport.suspended && viewport.table.table === tableName) { - return true; - } - } - } - } - // Eliminate links to suspended viewports - getActiveLinks(linkDescriptors) { - return linkDescriptors.filter((linkDescriptor) => { - const viewport = this.viewports.get(linkDescriptor.parentVpId); - return viewport && !viewport.suspended; - }); - } - processUpdates() { - this.viewports.forEach((viewport) => { - var _a; - if (viewport.hasUpdatesToProcess) { - const result = viewport.getClientRows(); - if (result !== NO_DATA_UPDATE) { - const [rows, mode] = result; - const size = viewport.getNewRowCount(); - if (size !== void 0 || rows && rows.length > 0) { - debugEnabled4 && debug4( - \`postMessageToClient #\${viewport.clientViewportId} viewport-update \${mode}, \${(_a = rows == null ? void 0 : rows.length) != null ? _a : "no"} rows, size \${size}\` - ); - if (mode) { - this.postMessageToClient({ - clientViewportId: viewport.clientViewportId, - mode, - rows, - size, - type: "viewport-update" - }); - } - } - } - } - }); - } -}; - -// src/worker.ts -var server; -var { info: info4, infoEnabled: infoEnabled4 } = logger("worker"); -async function connectToServer(url, protocol, token, username, onConnectionStatusChange, retryLimitDisconnect, retryLimitStartup) { - const connection = await connect( - url, - protocol, - // if this was called during connect, we would get a ReferenceError, but it will - // never be called until subscriptions have been made, so this is safe. - //TODO do we need to listen in to the connection messages here so we can lock back in, in the event of a reconnenct ? - (msg) => { - if (isConnectionQualityMetrics(msg)) { - console.log("post connection metrics"); - postMessage({ type: "connection-metrics", messages: msg }); - } else if (isConnectionStatusMessage(msg)) { - onConnectionStatusChange(msg); - if (msg.status === "reconnected") { - server.reconnect(); - } - } else { - server.handleMessageFromServer(msg); - } - }, - retryLimitDisconnect, - retryLimitStartup - ); - server = new ServerProxy(connection, (msg) => sendMessageToClient(msg)); - if (connection.requiresLogin) { - await server.login(token, username); - } -} -function sendMessageToClient(message) { - postMessage(message); -} -var handleMessageFromClient = async ({ - data: message -}) => { - switch (message.type) { - case "connect": - await connectToServer( - message.url, - message.protocol, - message.token, - message.username, - postMessage, - message.retryLimitDisconnect, - message.retryLimitStartup - ); - postMessage({ type: "connected" }); - break; - case "subscribe": - infoEnabled4 && info4(\`client subscribe: \${JSON.stringify(message)}\`); - server.subscribe(message); - break; - case "unsubscribe": - infoEnabled4 && info4(\`client unsubscribe: \${JSON.stringify(message)}\`); - server.unsubscribe(message.viewport); - break; - default: - infoEnabled4 && info4(\`client message: \${JSON.stringify(message)}\`); - server.handleMessageFromClient(message); - } -}; -self.addEventListener("message", handleMessageFromClient); -postMessage({ type: "ready" }); + \`),Error(\`KeySet, no key found for rowIndex \${e}\`);return t}toDebugString(){return Array.from(this.keys.entries()).map((e,t)=>\`\${e}=>\${t}\`).join(",")}};var{IDX:tr}=M;var{SELECTED:sr}=M,x={False:0,True:1,First:2,Last:4};var St=(s,e)=>e>=s[0]&&e<=s[1],Tt=x.True+x.First+x.Last,Rt=x.True+x.First,Et=x.True+x.Last,Z=(s,e)=>{for(let t of s)if(typeof t=="number"){if(t===e)return Tt}else if(St(t,e))return e===t[0]?Rt:e===t[1]?Et:x.True;return x.False};var Se=s=>{if(s.every(t=>typeof t=="number"))return s;let e=[];for(let t of s)if(typeof t=="number")e.push(t);else for(let n=t[0];n<=t[1];n++)e.push(n);return e};var wt=(()=>{let s=0,e=()=>\`0000\${(Math.random()*36**4<<0).toString(36)}\`.slice(-4);return()=>(s+=1,\`u\${e()}\${s}\`)})();var{debug:Ns,debugEnabled:Ws,error:Ee,info:w,infoEnabled:vt,warn:L}=E("websocket-connection"),we="ws",Dt=s=>s.startsWith(we+"://")||s.startsWith(we+"s://"),xe={},ee=Symbol("setWebsocket"),G=Symbol("connectionCallback");async function Ie(s,e,t,n=10,r=5){return xe[s]={status:"connecting",connect:{allowed:r,remaining:r},reconnect:{allowed:n,remaining:n}},ve(s,e,t)}async function Q(s){throw Error("connection broken")}async function ve(s,e,t,n){let{status:r,connect:o,reconnect:a}=xe[s],u=r==="connecting"?o:a;try{t({type:"connection-status",status:"connecting"});let c=typeof n<"u",g=await _t(s,e);console.info("%c\u26A1 %cconnected","font-size: 24px;color: green;font-weight: bold;","color:green; font-size: 14px;"),n!==void 0&&n[ee](g);let i=n!=null?n:new te(g,s,e,t),l=c?"reconnected":"connection-open-awaiting-session";return t({type:"connection-status",status:l}),i.status=l,u.remaining=u.allowed,i}catch{let g=--u.remaining>0;if(t({type:"connection-status",status:"disconnected",reason:"failed to connect",retry:g}),g)return Lt(s,e,t,n,2e3);throw Error("Failed to establish connection")}}var Lt=(s,e,t,n,r)=>new Promise(o=>{setTimeout(()=>{o(ve(s,e,t,n))},r)}),_t=(s,e)=>new Promise((t,n)=>{let r=Dt(s)?s:\`wss://\${s}\`;vt&&e!==void 0&&w(\`WebSocket Protocol \${e==null?void 0:e.toString()}\`);let o=new WebSocket(r,e);o.onopen=()=>t(o),o.onerror=a=>n(a)}),Ve=()=>{L==null||L("Connection cannot be closed, socket not yet opened")},Me=s=>{L==null||L(\`Message cannot be sent, socket closed \${s.body.type}\`)},Pt=s=>{try{return JSON.parse(s)}catch{throw Error(\`Error parsing JSON response from server \${s}\`)}},te=class{constructor(e,t,n,r){this.close=Ve;this.requiresLogin=!0;this.send=Me;this.status="ready";this.messagesCount=0;this.connectionMetricsInterval=null;this.handleWebsocketMessage=e=>{let t=Pt(e.data);this.messagesCount+=1,this[G](t)};this.url=t,this.protocol=n,this[G]=r,this[ee](e)}reconnect(){Q(this)}[(G,ee)](e){let t=this[G];e.onmessage=o=>{this.status="connected",e.onmessage=this.handleWebsocketMessage,this.handleWebsocketMessage(o)},this.connectionMetricsInterval=setInterval(()=>{t({type:"connection-metrics",messagesLength:this.messagesCount}),this.messagesCount=0},2e3),e.onerror=()=>{Ee("\u26A1 connection error"),t({type:"connection-status",status:"disconnected",reason:"error"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status==="connection-open-awaiting-session"?Ee("Websocket connection lost before Vuu session established, check websocket configuration"):this.status!=="closed"&&(Q(this),this.send=r)},e.onclose=()=>{w==null||w("\u26A1 connection close"),t({type:"connection-status",status:"disconnected",reason:"close"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!=="closed"&&(Q(this),this.send=r)};let n=o=>{e.send(JSON.stringify(o))},r=o=>{w==null||w(\`TODO queue message until websocket reconnected \${o.body.type}\`)};this.send=n,this.close=()=>{this.status="closed",e.close(),this.close=Ve,this.send=Me,w==null||w("close websocket")}}};var Ot=["VIEW_PORT_MENUS_SELECT_RPC","VIEW_PORT_MENU_TABLE_RPC","VIEW_PORT_MENU_ROW_RPC","VIEW_PORT_MENU_CELL_RPC","VP_EDIT_CELL_RPC","VP_EDIT_ROW_RPC","VP_EDIT_ADD_ROW_RPC","VP_EDIT_DELETE_CELL_RPC","VP_EDIT_DELETE_ROW_RPC","VP_EDIT_SUBMIT_FORM_RPC"],De=s=>Ot.includes(s.type),ne=({requestId:s,...e})=>[s,e],Le=s=>{let e=s.at(0);if(e.updateType==="SIZE"){if(s.length===1)return s;e=s.at(1)}let t=s.at(-1);return[e,t]},_e=s=>{let e={};for(let t of s)(e[t.viewPortId]||(e[t.viewPortId]=[])).push(t);return e};var re=({columns:s,dataTypes:e,key:t,table:n})=>({table:n,columns:s.map((r,o)=>({name:r,serverDataType:e[o]})),key:t});var Pe=s=>s.type==="connection-status",Oe=s=>s.type==="connection-metrics";var ke=s=>"viewport"in s,Ae=s=>s.type==="VIEW_PORT_MENU_RESP"&&s.action!==null&&B(s.action.table),B=s=>s!==null&&typeof s=="object"&&"table"in s&&"module"in s?s.table.startsWith("session"):!1;var Ue="CHANGE_VP_SUCCESS",Fe="CHANGE_VP_RANGE_SUCCESS",Ne="CLOSE_TREE_NODE",We="CLOSE_TREE_SUCCESS";var \$e="CREATE_VP",qe="CREATE_VP_SUCCESS",Ge="DISABLE_VP",Be="DISABLE_VP_SUCCESS";var Ke="ENABLE_VP",He="ENABLE_VP_SUCCESS";var se="GET_VP_VISUAL_LINKS",je="GET_VIEW_PORT_MENUS";var ze="HB",Je="HB_RESP",Ye="LOGIN",Ze="LOGIN_SUCCESS",Xe="OPEN_TREE_NODE",Qe="OPEN_TREE_SUCCESS";var et="REMOVE_VP";var oe="RPC_RESP";var tt="SET_SELECTION_SUCCESS",ie="TABLE_META_RESP",ae="TABLE_LIST_RESP",nt="TABLE_ROW";var st=s=>{switch(s){case"TypeAheadRpcHandler":return"TYPEAHEAD";default:return"SIMUL"}};var ot=[],R=E("array-backed-moving-window");function kt(s,e){if(!e||e.data.length!==s.data.length||e.sel!==s.sel)return!1;for(let t=0;t{var t;if((t=R.info)==null||t.call(R,\`setRowCount \${e}\`),e{let n=this.bufferSize*.25;return p(this,h).to-t0&&e-p(this,h).from0&&this.clientRange.from+this.rowsWithinRange===this.rowCount}outOfRange(e,t){let{from:n,to:r}=this.range;if(t=r)return!0}setAtIndex(e){let{rowIndex:t}=e,n=t-p(this,h).from;if(kt(e,this.internalData[n]))return!1;let r=this.isWithinClientRange(t);return(r||this.isWithinRange(t))&&(!this.internalData[n]&&r&&(this.rowsWithinRange+=1),this.internalData[n]=e),r}getAtIndex(e){return p(this,h).isWithin(e)&&this.internalData[e-p(this,h).from]!=null?this.internalData[e-p(this,h).from]:void 0}isWithinRange(e){return p(this,h).isWithin(e)}isWithinClientRange(e){return this.clientRange.isWithin(e)}setClientRange(e,t){var g;(g=R.debug)==null||g.call(R,\`setClientRange \${e} - \${t}\`);let n=this.clientRange.from,r=Math.min(this.clientRange.to,this.rowCount);if(e===n&&t===r)return[!1,ot];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let i=e;io.to){let i=Math.max(e,o.to);a=this.internalData.slice(i-u,t-u)}else{let i=Math.min(o.from,t);a=this.internalData.slice(e-u,i-u)}return[this.bufferBreakout(e,t),a]}setRange(e,t){var n,r;if(e!==p(this,h).from||t!==p(this,h).to){(n=R.debug)==null||n.call(R,\`setRange \${e} - \${t}\`);let[o,a]=p(this,h).overlap(e,t),u=new Array(t-e);this.rowsWithinRange=0;for(let c=o;c=0;o--)if(e[o]!==void 0){r=e[o];break}return n&&r?[n.rowIndex,r.rowIndex]:[-1,-1]}};h=new WeakMap;var At=[],{debug:C,debugEnabled:H,error:Ut,info:d,infoEnabled:Ft,warn:_}=E("viewport"),Nt=({rowKey:s,updateType:e})=>e==="U"&&!s.startsWith("\$root"),j=[void 0,void 0],Wt={count:0,mode:void 0,size:0,ts:0},z=class{constructor({aggregations:e,bufferSize:t=50,columns:n,filter:r,groupBy:o=[],table:a,range:u,sort:c,title:g,viewport:i,visualLink:l},f){this.batchMode=!0;this.hasUpdates=!1;this.pendingUpdates=[];this.pendingOperations=new Map;this.pendingRangeRequests=[];this.rowCountChanged=!1;this.selectedRows=[];this.tableSchema=null;this.useBatchMode=!0;this.lastUpdateStatus=Wt;this.updateThrottleTimer=void 0;this.rangeMonitor=new W("ViewPort");this.disabled=!1;this.isTree=!1;this.status="";this.suspended=!1;this.suspendTimer=null;this.setLastSizeOnlyUpdateSize=e=>{this.lastUpdateStatus.size=e};this.setLastUpdate=e=>{let{ts:t,mode:n}=this.lastUpdateStatus,r=0;if(n===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,r=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,r=0;return this.lastUpdateStatus.mode=e,r};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,n=t*.25,{from:r}=e;for(let{from:o,to:a}of this.pendingRangeRequests)if(r>=o&&r{this.updateThrottleTimer=void 0,this.lastUpdateStatus.count=3,this.postMessageToClient({clientViewportId:this.clientViewportId,mode:"size-only",size:this.lastUpdateStatus.size,type:"viewport-update"})};this.shouldThrottleMessage=e=>{let t=this.setLastUpdate(e);return e==="size-only"&&t>0&&t<500&&this.lastUpdateStatus.count>3};this.throttleMessage=e=>this.shouldThrottleMessage(e)?(d==null||d("throttling updates setTimeout to 2000"),this.updateThrottleTimer===void 0&&(this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,2e3)),!0):(this.updateThrottleTimer!==void 0&&(clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),!1);this.getNewRowCount=()=>{if(this.rowCountChanged&&this.dataWindow)return this.rowCountChanged=!1,this.dataWindow.rowCount};this.aggregations=e,this.bufferSize=t,this.clientRange=u,this.clientViewportId=i,this.columns=n,this.filter=r,this.groupBy=o,this.keys=new q(u),this.pendingLinkedParent=l,this.table=a,this.sort=c,this.title=g,Ft&&(d==null||d(\`constructor #\${i} \${a.table} bufferSize=\${t}\`)),this.dataWindow=new K(this.clientRange,u,this.bufferSize),this.postMessageToClient=f}get hasUpdatesToProcess(){return this.suspended?!1:this.rowCountChanged||this.hasUpdates}get size(){var e;return(e=this.dataWindow.rowCount)!=null?e:0}subscribe(){let{filter:e}=this.filter;return this.status=this.status==="subscribed"?"resubscribing":"subscribing",{type:\$e,table:this.table,range:Y(this.clientRange,this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:e}}}handleSubscribed({viewPortId:e,aggregations:t,columns:n,filterSpec:r,range:o,sort:a,groupBy:u}){return this.serverViewportId=e,this.status="subscribed",this.aggregations=t,this.columns=n,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow.setRange(o.from,o.to),{aggregations:t,type:"subscribed",clientViewportId:this.clientViewportId,columns:n,filter:r,groupBy:u,range:o,sort:a,tableSchema:this.tableSchema}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:n,pendingOperations:r}=this,o=r.get(e);if(!o){Ut("no matching operation found to complete");return}let{type:a}=o;if(d==null||d(\`completeOperation \${a}\`),r.delete(e),a==="CHANGE_VP_RANGE"){let[c,g]=t;(u=this.dataWindow)==null||u.setRange(c,g);for(let i=this.pendingRangeRequests.length-1;i>=0;i--){let l=this.pendingRangeRequests[i];if(l.requestId===e){l.acked=!0;break}else _==null||_("range requests sent faster than they are being ACKed")}}else if(a==="config"){let{aggregations:c,columns:g,filter:i,groupBy:l,sort:f}=o.data;return this.aggregations=c,this.columns=g,this.filter=i,this.groupBy=l,this.sort=f,l.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),C==null||C(\`config change confirmed, isTree : \${this.isTree}\`),{clientViewportId:n,type:a,config:o.data}}else{if(a==="groupBy")return this.isTree=o.data.length>0,this.groupBy=o.data,C==null||C(\`groupBy change confirmed, isTree : \${this.isTree}\`),{clientViewportId:n,type:a,groupBy:o.data};if(a==="columns")return this.columns=o.data,{clientViewportId:n,type:a,columns:o.data};if(a==="filter")return this.filter=o.data,{clientViewportId:n,type:a,filter:o.data};if(a==="aggregate")return this.aggregations=o.data,{clientViewportId:n,type:"aggregate",aggregations:this.aggregations};if(a==="sort")return this.sort=o.data,{clientViewportId:n,type:a,sort:this.sort};if(a!=="selection"){if(a==="disable")return this.disabled=!0,{type:"disabled",clientViewportId:n};if(a==="enable")return this.disabled=!1,{type:"enabled",clientViewportId:n};if(a==="CREATE_VISUAL_LINK"){let[c,g,i]=t;return this.linkedParent={colName:c,parentViewportId:g,parentColName:i},this.pendingLinkedParent=void 0,{type:"vuu-link-created",clientViewportId:n,colName:c,parentViewportId:g,parentColName:i}}else if(a==="REMOVE_VISUAL_LINK")return this.linkedParent=void 0,{type:"vuu-link-removed",clientViewportId:n}}}}rangeRequest(e,t){H&&this.rangeMonitor.set(t);let n="CHANGE_VP_RANGE";if(this.dataWindow){let[r,o]=this.dataWindow.setClientRange(t.from,t.to),a,u=this.dataWindow.rowCount||void 0,c=r&&!this.rangeRequestAlreadyPending(t)?{type:n,viewPortId:this.serverViewportId,...Y(t,this.bufferSize,u)}:null;if(c){H&&(C==null||C(\`create CHANGE_VP_RANGE: [\${c.from} - \${c.to}]\`)),this.awaitOperation(e,{type:n});let i=this.pendingRangeRequests.at(-1);if(i)if(i.acked)console.warn("Range Request before previous request is filled");else{let{from:l,to:f}=i;this.dataWindow.outOfRange(l,f)?a={clientViewportId:this.clientViewportId,type:"debounce-begin"}:_==null||_("Range Request before previous request is acked")}this.pendingRangeRequests.push({...c,requestId:e}),this.useBatchMode&&(this.batchMode=!0)}else o.length>0&&(this.batchMode=!1);this.keys.reset(this.dataWindow.clientRange);let g=this.isTree?le:ue;return o.length?[c,o.map(i=>g(i,this.keys,this.selectedRows))]:a?[c,void 0,a]:[c]}else return[null]}setLinks(e){return this.links=e,[{type:"vuu-links",links:e,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(e){return{type:"vuu-menu",menu:e,clientViewportId:this.clientViewportId}}setTableSchema(e){this.tableSchema=e}openTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Xe,vpId:this.serverViewportId,treeKey:t.key}}closeTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Ne,vpId:this.serverViewportId,treeKey:t.key}}createLink(e,t,n,r){let o={type:"CREATE_VISUAL_LINK",parentVpId:n,childVpId:this.serverViewportId,parentColumnName:r,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:"REMOVE_VISUAL_LINK",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,d==null||d("suspend")}resume(){return this.suspended=!1,H&&(C==null||C(\`resume: \${this.currentData()}\`)),this.currentData()}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:n}=this,r=this.isTree?le:ue;for(let o of t)o&&e.push(r(o,n,this.selectedRows))}return e}enable(e){return this.awaitOperation(e,{type:"enable"}),d==null||d(\`enable: \${this.serverViewportId}\`),{type:Ke,viewPortId:this.serverViewportId}}disable(e){return this.awaitOperation(e,{type:"disable"}),d==null||d(\`disable: \${this.serverViewportId}\`),this.suspended=!1,{type:Ge,viewPortId:this.serverViewportId}}columnRequest(e,t){return this.awaitOperation(e,{type:"columns",data:t}),C==null||C(\`columnRequest: \${t}\`),this.createRequest({columns:t})}filterRequest(e,t){this.awaitOperation(e,{type:"filter",data:t}),this.useBatchMode&&(this.batchMode=!0);let{filter:n}=t;return d==null||d(\`filterRequest: \${n}\`),this.createRequest({filterSpec:{filter:n}})}setConfig(e,t){this.awaitOperation(e,{type:"config",data:t});let{filter:n,...r}=t;return this.useBatchMode&&(this.batchMode=!0),H?C==null||C(\`setConfig \${JSON.stringify(t)}\`):d==null||d("setConfig"),this.createRequest({...r,filterSpec:typeof(n==null?void 0:n.filter)=="string"?{filter:n.filter}:{filter:""}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:"aggregate",data:t}),d==null||d(\`aggregateRequest: \${t}\`),this.createRequest({aggregations:t})}sortRequest(e,t){return this.awaitOperation(e,{type:"sort",data:t}),d==null||d(\`sortRequest: \${JSON.stringify(t.sortDefs)}\`),this.createRequest({sort:t})}groupByRequest(e,t=At){var n;return this.awaitOperation(e,{type:"groupBy",data:t}),this.useBatchMode&&(this.batchMode=!0),this.isTree||(n=this.dataWindow)==null||n.clear(),this.createRequest({groupBy:t})}selectRequest(e,t){return this.selectedRows=t,this.awaitOperation(e,{type:"selection",data:t}),d==null||d(\`selectRequest: \${t}\`),{type:"SET_SELECTION",vpId:this.serverViewportId,selection:Se(t)}}removePendingRangeRequest(e,t){for(let n=this.pendingRangeRequests.length-1;n>=0;n--){let{from:r,to:o}=this.pendingRangeRequests[n],a=!0;if(e>=r&&er&&t0){e=[],t="update";for(let a of this.pendingUpdates)e.push(o(a,n,r));this.pendingUpdates.length=0}else{let a=this.dataWindow.getData();if(this.dataWindow.hasAllRowsWithinRange){e=[],t="batch";for(let u of a)e.push(o(u,n,r));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?j:[e,t]}createRequest(e,t=!1){return t?{type:"CHANGE_VP",viewPortId:this.serverViewportId,...e}:{type:"CHANGE_VP",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...e}}},ue=({rowIndex:s,rowKey:e,sel:t,data:n},r,o)=>[s,r.keyFor(s),!0,!1,0,0,e,t?Z(o,s):0].concat(n),le=({rowIndex:s,rowKey:e,sel:t,data:n},r,o)=>{let[a,u,,c,,g,...i]=n;return[s,r.keyFor(s),c,u,a,g,e,t?Z(o,s):0].concat(i)};var it=1;var{debug:I,debugEnabled:P,error:O,info:S,infoEnabled:\$t,warn:k}=E("server-proxy"),b=()=>\`\${it++}\`,qt={},Gt=s=>s.disabled!==!0&&s.suspended!==!0,Bt={type:"NO_ACTION"},Kt=(s,e,t)=>s.map(n=>n.parentVpId===e?{...n,label:t}:n);function Ht(s,e){return s.map(t=>{let{parentVpId:n}=t,r=e.get(n);if(r)return{...t,parentClientVpId:r.clientViewportId,label:r.title};throw Error("addLabelsToLinks viewport not found")})}var J=class{constructor(e,t){this.authToken="";this.user="user";this.pendingTableMetaRequests=new Map;this.pendingRequests=new Map;this.queuedRequests=[];this.cachedTableSchemas=new Map;this.connection=e,this.postMessageToClient=t,this.viewports=new Map,this.mapClientToServerViewport=new Map}async reconnect(){await this.login(this.authToken);let[e,t]=he(Array.from(this.viewports.values()),Gt);this.viewports.clear(),this.mapClientToServerViewport.clear();let n=r=>{r.forEach(o=>{let{clientViewportId:a}=o;this.viewports.set(a,o),this.sendMessageToServer(o.subscribe(),a)})};n(e),setTimeout(()=>{n(t)},2e3)}async login(e,t="user"){if(e)return this.authToken=e,this.user=t,new Promise((n,r)=>{this.sendMessageToServer({type:Ye,token:this.authToken,user:t},""),this.pendingLogin={resolve:n,reject:r}});this.authToken===""&&O("login, cannot login until auth token has been obtained")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))O(\`spurious subscribe call \${e.viewport}\`);else{if(!this.hasSchemaForTable(e.table)&&!B(e.table)){S==null||S(\`subscribe to \${e.table.table}, no metadata yet, request metadata\`);let n=b();this.sendMessageToServer({type:"GET_TABLE_META",table:e.table},n),this.pendingTableMetaRequests.set(n,e.viewport)}let t=new z(e,this.postMessageToClient);this.viewports.set(e.viewport,t),this.sendIfReady(t.subscribe(),e.viewport,this.sessionId!=="")}}unsubscribe(e){let t=this.mapClientToServerViewport.get(e);t?(S==null||S(\`Unsubscribe Message (Client to Server): + \${t}\`),this.sendMessageToServer({type:et,viewPortId:t})):O(\`failed to unsubscribe client viewport \${e}, viewport not found\`)}getViewportForClient(e,t=!0){let n=this.mapClientToServerViewport.get(e);if(n){let r=this.viewports.get(n);if(r)return r;if(t)throw Error(\`Viewport not found for client viewport \${e}\`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(\`Viewport server id not found for client viewport \${e}\`);return null}}setViewRange(e,t){let n=b(),[r,o,a]=e.rangeRequest(n,t.range);S==null||S(\`setViewRange \${t.range.from} - \${t.range.to}\`),r&&this.sendIfReady(r,n,e.status==="subscribed"),o?(S==null||S(\`setViewRange \${o.length} rows returned from cache\`),this.postMessageToClient({mode:"batch",type:"viewport-update",clientViewportId:e.clientViewportId,rows:o})):a&&this.postMessageToClient(a)}setConfig(e,t){let n=b(),r=e.setConfig(n,t.config);this.sendIfReady(r,n,e.status==="subscribed")}aggregate(e,t){let n=b(),r=e.aggregateRequest(n,t.aggregations);this.sendIfReady(r,n,e.status==="subscribed")}sort(e,t){let n=b(),r=e.sortRequest(n,t.sort);this.sendIfReady(r,n,e.status==="subscribed")}groupBy(e,t){let n=b(),r=e.groupByRequest(n,t.groupBy);this.sendIfReady(r,n,e.status==="subscribed")}filter(e,t){let n=b(),{filter:r}=t,o=e.filterRequest(n,r);this.sendIfReady(o,n,e.status==="subscribed")}setColumns(e,t){let n=b(),{columns:r}=t,o=e.columnRequest(n,r);this.sendIfReady(o,n,e.status==="subscribed")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let n=b(),{selected:r}=t,o=e.selectRequest(n,r);this.sendIfReady(o,n,e.status==="subscribed")}disableViewport(e){let t=b(),n=e.disable(t);this.sendIfReady(n,t,e.status==="subscribed")}enableViewport(e){if(e.disabled){let t=b(),n=e.enable(t);this.sendIfReady(n,t,e.status==="subscribed")}}suspendViewport(e){e.suspend(),e.suspendTimer=setTimeout(()=>{S==null||S("suspendTimer expired, escalate suspend to disable"),this.disableViewport(e)},3e3)}resumeViewport(e){e.suspendTimer&&(I==null||I("clear suspend timer"),clearTimeout(e.suspendTimer),e.suspendTimer=null);let t=e.resume();this.postMessageToClient({clientViewportId:e.clientViewportId,mode:"batch",rows:t,type:"viewport-update"})}openTreeNode(e,t){if(e.serverViewportId){let n=b();this.sendIfReady(e.openTreeNode(n,t),n,e.status==="subscribed")}}closeTreeNode(e,t){if(e.serverViewportId){let n=b();this.sendIfReady(e.closeTreeNode(n,t),n,e.status==="subscribed")}}createLink(e,t){let{parentClientVpId:n,parentColumnName:r,childColumnName:o}=t,a=b(),u=this.mapClientToServerViewport.get(n);if(u){let c=e.createLink(a,o,u,r);this.sendMessageToServer(c,a)}else O("ServerProxy unable to create link, viewport not found")}removeLink(e){let t=b(),n=e.removeLink(t);this.sendMessageToServer(n,t)}updateTitleOnVisualLinks(e){var r;let{serverViewportId:t,title:n}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&n&&(r=o.links)!=null&&r.some(a=>a.parentVpId===t)){let[a]=o.setLinks(Kt(o.links,t,n));this.postMessageToClient(a)}}removeViewportFromVisualLinks(e){var t;for(let n of this.viewports.values())if((t=n.links)!=null&&t.some(({parentVpId:r})=>r===e)){let[r]=n.setLinks(n.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(r)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,r]=ne(e);this.sendMessageToServer({...r,vpId:t.serverViewportId},n)}}rpcCall(e){let[t,n]=ne(e),r=st(n.service);this.sendMessageToServer(n,t,{module:r})}handleMessageFromClient(e){if(ke(e))if(e.type==="disable"){let t=this.getViewportForClient(e.viewport,!1);return t!==null?this.disableViewport(t):void 0}else{let t=this.getViewportForClient(e.viewport);switch(e.type){case"setViewRange":return this.setViewRange(t,e);case"config":return this.setConfig(t,e);case"aggregate":return this.aggregate(t,e);case"sort":return this.sort(t,e);case"groupBy":return this.groupBy(t,e);case"filter":return this.filter(t,e);case"select":return this.select(t,e);case"suspend":return this.suspendViewport(t);case"resume":return this.resumeViewport(t);case"enable":return this.enableViewport(t);case"openTreeNode":return this.openTreeNode(t,e);case"closeTreeNode":return this.closeTreeNode(t,e);case"createLink":return this.createLink(t,e);case"removeLink":return this.removeLink(t);case"setColumns":return this.setColumns(t,e);case"setTitle":return this.setTitle(t,e);default:}}else{if(De(e))return this.menuRpcCall(e);{let{type:t,requestId:n}=e;switch(t){case"GET_TABLE_LIST":return this.sendMessageToServer({type:t},n);case"GET_TABLE_META":return this.sendMessageToServer({type:t,table:e.table},n);case"RPC_CALL":return this.rpcCall(e);default:}}}O(\`Vuu ServerProxy Unexpected message from client \${JSON.stringify(e)}\`)}awaitResponseToMessage(e){return new Promise((t,n)=>{let r=b();this.sendMessageToServer(e,r),this.pendingRequests.set(r,{reject:n,resolve:t})})}sendIfReady(e,t,n=!0){return n?this.sendMessageToServer(e,t):this.queuedRequests.push(e),n}sendMessageToServer(e,t=\`\${it++}\`,n=qt){let{module:r="CORE"}=n;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:r,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:n,sessionId:r}=e,o=this.pendingRequests.get(n);if(o){let{resolve:i}=o;this.pendingRequests.delete(n),i(t);return}let{viewports:a}=this;switch(t.type){case ze:this.sendMessageToServer({type:Je,ts:+new Date},"NA");break;case Ze:if(r)this.sessionId=r,(u=this.pendingLogin)==null||u.resolve(r),this.pendingLogin=void 0;else throw Error("LOGIN_SUCCESS did not provide sessionId");break;case qe:{let i=a.get(n);if(i){let{status:l}=i,{viewPortId:f}=t;n!==f&&(a.delete(n),a.set(f,i)),this.mapClientToServerViewport.set(n,f);let T=i.handleSubscribed(t);T&&(this.postMessageToClient(T),P&&I(\`post DataSourceSubscribedMessage to client: \${JSON.stringify(T)}\`)),i.disabled&&this.disableViewport(i),l==="subscribing"&&!B(i.table)&&(this.sendMessageToServer({type:se,vpId:f}),this.sendMessageToServer({type:je,vpId:f}),Array.from(a.entries()).filter(([V,{disabled:A}])=>V!==f&&!A).forEach(([V])=>{this.sendMessageToServer({type:se,vpId:V})}))}}break;case"REMOVE_VP_SUCCESS":{let i=a.get(t.viewPortId);i&&(this.mapClientToServerViewport.delete(i.clientViewportId),a.delete(t.viewPortId),this.removeViewportFromVisualLinks(t.viewPortId))}break;case tt:{let i=this.viewports.get(t.vpId);i&&i.completeOperation(n)}break;case Ue:case Be:if(a.has(t.viewPortId)){let i=this.viewports.get(t.viewPortId);if(i){let l=i.completeOperation(n);l!==void 0&&(this.postMessageToClient(l),P&&I(\`postMessageToClient \${JSON.stringify(l)}\`))}}break;case He:{let i=this.viewports.get(t.viewPortId);if(i){let l=i.completeOperation(n);if(l){this.postMessageToClient(l);let f=i.currentData();P&&I(\`Enable Response (ServerProxy to Client): \${JSON.stringify(l)}\`),i.size===0?P&&I("Viewport Enabled but size 0, resend to server"):(this.postMessageToClient({clientViewportId:i.clientViewportId,mode:"batch",rows:f,size:i.size,type:"viewport-update"}),P&&I(\`Enable Response (ServerProxy to Client): send size \${i.size} \${f.length} rows from cache\`))}}}break;case nt:{let i=_e(t.rows);for(let[l,f]of Object.entries(i)){let T=a.get(l);T?T.updateRows(f):k==null||k(\`TABLE_ROW message received for non registered viewport \${l}\`)}this.processUpdates()}break;case Fe:{let i=this.viewports.get(t.viewPortId);if(i){let{from:l,to:f}=t;i.completeOperation(n,l,f)}}break;case Qe:case We:break;case"CREATE_VISUAL_LINK_SUCCESS":{let i=this.viewports.get(t.childVpId),l=this.viewports.get(t.parentVpId);if(i&&l){let{childColumnName:f,parentColumnName:T}=t,V=i.completeOperation(n,f,l.clientViewportId,T);V&&this.postMessageToClient(V)}}break;case"REMOVE_VISUAL_LINK_SUCCESS":{let i=this.viewports.get(t.childVpId);if(i){let l=i.completeOperation(n);l&&this.postMessageToClient(l)}}break;case ae:this.postMessageToClient({type:ae,tables:t.tables,requestId:n});break;case ie:{let i=this.cacheTableMeta(t),l=this.pendingTableMetaRequests.get(n);if(l){this.pendingTableMetaRequests.delete(n);let f=this.viewports.get(l);f?f.setTableSchema(i):k==null||k("Message has come back AFTER CREATE_VP_SUCCESS, what do we do now")}else this.postMessageToClient({type:ie,tableSchema:i,requestId:n})}break;case"VP_VISUAL_LINKS_RESP":{let i=this.getActiveLinks(t.links),l=this.viewports.get(t.vpId);if(i.length&&l){let f=Ht(i,this.viewports),[T,V]=l.setLinks(f);if(this.postMessageToClient(T),V){let{link:A,parentClientVpId:at}=V,de=b(),ge=this.mapClientToServerViewport.get(at);if(ge){let ut=l.createLink(de,A.fromColumn,ge,A.toColumn);this.sendMessageToServer(ut,de)}}}}break;case"VIEW_PORT_MENUS_RESP":if(t.menu.name){let i=this.viewports.get(t.vpId);if(i){let l=i.setMenu(t.menu);this.postMessageToClient(l)}}break;case"VP_EDIT_RPC_RESPONSE":this.postMessageToClient({action:t.action,requestId:n,rpcName:t.rpcName,type:"VP_EDIT_RPC_RESPONSE"});break;case"VP_EDIT_RPC_REJECT":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:n,type:"VP_EDIT_RPC_REJECT",error:t.error});break;case"VIEW_PORT_MENU_REJ":{console.log("send menu error back to client");let{error:i,rpcName:l,vpId:f}=t,T=this.viewports.get(f);T&&this.postMessageToClient({clientViewportId:T.clientViewportId,error:i,rpcName:l,type:"VIEW_PORT_MENU_REJ",requestId:n});break}case"VIEW_PORT_MENU_RESP":if(Ae(t)){let{action:i,rpcName:l}=t;this.awaitResponseToMessage({type:"GET_TABLE_META",table:i.table}).then(f=>{let T=re(f);this.postMessageToClient({rpcName:l,type:"VIEW_PORT_MENU_RESP",action:{...i,tableSchema:T},tableAlreadyOpen:this.isTableOpen(i.table),requestId:n})})}else{let{action:i}=t;this.postMessageToClient({type:"VIEW_PORT_MENU_RESP",action:i||Bt,tableAlreadyOpen:i!==null&&this.isTableOpen(i.table),requestId:n})}break;case oe:{let{method:i,result:l}=t;this.postMessageToClient({type:oe,method:i,result:l,requestId:n})}break;case"ERROR":O(t.msg);break;default:\$t&&S(\`handleMessageFromServer \${t.type}.\`)}}hasSchemaForTable(e){return this.cachedTableSchemas.has(\`\${e.module}:\${e.table}\`)}cacheTableMeta(e){let{module:t,table:n}=e.table,r=\`\${t}:\${n}\`,o=this.cachedTableSchemas.get(r);return o||(o=re(e),this.cachedTableSchemas.set(r,o)),o}isTableOpen(e){if(e){let t=e.table;for(let n of this.viewports.values())if(!n.suspended&&n.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let n=this.viewports.get(t.parentVpId);return n&&!n.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let n=e.getClientRows();if(n!==j){let[r,o]=n,a=e.getNewRowCount();(a!==void 0||r&&r.length>0)&&(P&&I(\`postMessageToClient #\${e.clientViewportId} viewport-update \${o}, \${(t=r==null?void 0:r.length)!=null?t:"no"} rows, size \${a}\`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:r,size:a,type:"viewport-update"}))}}})}};var D,{info:ce,infoEnabled:pe}=E("worker");async function jt(s,e,t,n,r,o,a){let u=await Ie(s,e,c=>{Oe(c)?(console.log("post connection metrics"),postMessage({type:"connection-metrics",messages:c})):Pe(c)?(r(c),c.status==="reconnected"&&D.reconnect()):D.handleMessageFromServer(c)},o,a);D=new J(u,c=>zt(c)),u.requiresLogin&&await D.login(t,n)}function zt(s){postMessage(s)}var Jt=async({data:s})=>{switch(s.type){case"connect":await jt(s.url,s.protocol,s.token,s.username,postMessage,s.retryLimitDisconnect,s.retryLimitStartup),postMessage({type:"connected"});break;case"subscribe":pe&&ce(\`client subscribe: \${JSON.stringify(s)}\`),D.subscribe(s);break;case"unsubscribe":pe&&ce(\`client unsubscribe: \${JSON.stringify(s)}\`),D.unsubscribe(s.viewport);break;default:pe&&ce(\`client message: \${JSON.stringify(s)}\`),D.handleMessageFromClient(s)}};self.addEventListener("message",Jt);postMessage({type:"ready"}); `; \ No newline at end of file diff --git a/vuu/src/main/resources/application.conf b/vuu/src/main/resources/application.conf deleted file mode 100644 index 58d463515..000000000 --- a/vuu/src/main/resources/application.conf +++ /dev/null @@ -1,3 +0,0 @@ -vuu.webroot="vuu-ui/deployed_apps/app-vuu-example" -vuu.certPath="vuu/src/main/resources/certs/cert.pem" -vuu.keyPath="vuu/src/main/resources/certs/key.pem" \ No newline at end of file diff --git a/vuu/src/main/resources/issue/size.noset.vuu.log b/vuu/src/main/resources/issue/size.noset.vuu.log deleted file mode 100644 index f6f7aaefc..000000000 --- a/vuu/src/main/resources/issue/size.noset.vuu.log +++ /dev/null @@ -1,232 +0,0 @@ -17:29:19.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [AUTH] success -17:29:19.670 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [LOGIN] success UserPrincipal(user,d4961423-48d4-4894-bfd8-37d6ecd20db8,8c81ea07-70de-4235-b1c8-60345b1bf3bc) -17:29:19.839 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:19.936 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:20.005 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - TABLELIST -17:29:20.096 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [TABLEMETA] orderEntry from server -17:29:22.214 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [TABLEMETA] instruments from server -17:29:26.381 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Create Success -17:29:26.503 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 1 for user-ea5988c5-3aff-46cf-8753-1ee602545384 rowSize = 0 -17:29:26.505 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key SIZE, vpSize 0, data [] -17:29:26.980 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 100 for user-ea5988c5-3aff-46cf-8753-1ee602545384 rowSize = 0 -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.L, vpSize 0, data [AAA.L, AAA.L London PLC, USD, XLON/LSE-SETS, 633] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.N, vpSize 0, data [AAA.N, AAA.N Corporation, EUR, XNGS/NAS-GSM, 220] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.OQ, vpSize 0, data [AAA.OQ, AAA.OQ Co., EUR, XNYS/NYS-MAIN, 393] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.AS, vpSize 0, data [AAA.AS, AAA.AS B.V, GBX, XAMS/ENA-MAIN, 449] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.L, vpSize 0, data [AAB.L, AAB.L London PLC, GBX, XLON/LSE-SETS, 37] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.N, vpSize 0, data [AAB.N, AAB.N Corporation, CAD, XNGS/NAS-GSM, 38] -17:29:26.981 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.OQ, vpSize 0, data [AAB.OQ, AAB.OQ Co., GBX, XNYS/NYS-MAIN, 286] -17:29:26.982 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.AS, vpSize 0, data [AAB.AS, AAB.AS B.V, USD, XAMS/ENA-MAIN, 364] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.L, vpSize 0, data [AAC.L, AAC.L London PLC, EUR, XLON/LSE-SETS, 12] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.N, vpSize 0, data [AAC.N, AAC.N Corporation, CAD, XNGS/NAS-GSM, 927] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.OQ, vpSize 0, data [AAC.OQ, AAC.OQ Co., GBX, XNYS/NYS-MAIN, 559] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.AS, vpSize 0, data [AAC.AS, AAC.AS B.V, CAD, XAMS/ENA-MAIN, 946] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.L, vpSize 0, data [AAD.L, AAD.L London PLC, CAD, XLON/LSE-SETS, 363] -17:29:26.983 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.N, vpSize 0, data [AAD.N, AAD.N Corporation, CAD, XNGS/NAS-GSM, 696] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.OQ, vpSize 0, data [AAD.OQ, AAD.OQ Co., EUR, XNYS/NYS-MAIN, 806] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.AS, vpSize 0, data [AAD.AS, AAD.AS B.V, GBX, XAMS/ENA-MAIN, 44] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.L, vpSize 0, data [AAE.L, AAE.L London PLC, GBX, XLON/LSE-SETS, 226] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.N, vpSize 0, data [AAE.N, AAE.N Corporation, GBX, XNGS/NAS-GSM, 54] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.OQ, vpSize 0, data [AAE.OQ, AAE.OQ Co., USD, XNYS/NYS-MAIN, 618] -17:29:26.984 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.AS, vpSize 0, data [AAE.AS, AAE.AS B.V, CAD, XAMS/ENA-MAIN, 643] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.L, vpSize 0, data [AAF.L, AAF.L London PLC, GBX, XLON/LSE-SETS, 690] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.N, vpSize 0, data [AAF.N, AAF.N Corporation, CAD, XNGS/NAS-GSM, 623] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.OQ, vpSize 0, data [AAF.OQ, AAF.OQ Co., USD, XNYS/NYS-MAIN, 167] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.AS, vpSize 0, data [AAF.AS, AAF.AS B.V, EUR, XAMS/ENA-MAIN, 410] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.L, vpSize 0, data [AAG.L, AAG.L London PLC, EUR, XLON/LSE-SETS, 928] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.N, vpSize 0, data [AAG.N, AAG.N Corporation, GBX, XNGS/NAS-GSM, 900] -17:29:26.985 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.OQ, vpSize 0, data [AAG.OQ, AAG.OQ Co., CAD, XNYS/NYS-MAIN, 896] -17:29:26.986 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.AS, vpSize 0, data [AAG.AS, AAG.AS B.V, USD, XAMS/ENA-MAIN, 934] -17:29:26.986 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.L, vpSize 0, data [AAH.L, AAH.L London PLC, USD, XLON/LSE-SETS, 553] -17:29:26.986 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.N, vpSize 0, data [AAH.N, AAH.N Corporation, EUR, XNGS/NAS-GSM, 879] -17:29:26.986 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.OQ, vpSize 0, data [AAH.OQ, AAH.OQ Co., GBX, XNYS/NYS-MAIN, 943] -17:29:26.986 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.AS, vpSize 0, data [AAH.AS, AAH.AS B.V, GBX, XAMS/ENA-MAIN, 303] -17:29:26.987 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.L, vpSize 0, data [AAI.L, AAI.L London PLC, CAD, XLON/LSE-SETS, 430] -17:29:26.987 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.N, vpSize 0, data [AAI.N, AAI.N Corporation, EUR, XNGS/NAS-GSM, 628] -17:29:26.987 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.OQ, vpSize 0, data [AAI.OQ, AAI.OQ Co., CAD, XNYS/NYS-MAIN, 720] -17:29:26.987 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.AS, vpSize 0, data [AAI.AS, AAI.AS B.V, EUR, XAMS/ENA-MAIN, 478] -17:29:26.988 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.L, vpSize 0, data [AAJ.L, AAJ.L London PLC, CAD, XLON/LSE-SETS, 759] -17:29:26.988 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.N, vpSize 0, data [AAJ.N, AAJ.N Corporation, GBX, XNGS/NAS-GSM, 697] -17:29:26.988 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.OQ, vpSize 0, data [AAJ.OQ, AAJ.OQ Co., EUR, XNYS/NYS-MAIN, 68] -17:29:26.988 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.AS, vpSize 0, data [AAJ.AS, AAJ.AS B.V, GBX, XAMS/ENA-MAIN, 199] -17:29:26.988 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.L, vpSize 0, data [AAK.L, AAK.L London PLC, USD, XLON/LSE-SETS, 873] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.N, vpSize 0, data [AAK.N, AAK.N Corporation, EUR, XNGS/NAS-GSM, 951] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.OQ, vpSize 0, data [AAK.OQ, AAK.OQ Co., EUR, XNYS/NYS-MAIN, 793] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.AS, vpSize 0, data [AAK.AS, AAK.AS B.V, USD, XAMS/ENA-MAIN, 382] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.L, vpSize 0, data [AAL.L, AAL.L London PLC, GBX, XLON/LSE-SETS, 578] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.N, vpSize 0, data [AAL.N, AAL.N Corporation, CAD, XNGS/NAS-GSM, 328] -17:29:26.989 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.OQ, vpSize 0, data [AAL.OQ, AAL.OQ Co., EUR, XNYS/NYS-MAIN, 76] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.AS, vpSize 0, data [AAL.AS, AAL.AS B.V, CAD, XAMS/ENA-MAIN, 691] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.L, vpSize 0, data [AAM.L, AAM.L London PLC, GBX, XLON/LSE-SETS, 161] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.N, vpSize 0, data [AAM.N, AAM.N Corporation, CAD, XNGS/NAS-GSM, 57] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.OQ, vpSize 0, data [AAM.OQ, AAM.OQ Co., CAD, XNYS/NYS-MAIN, 201] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.AS, vpSize 0, data [AAM.AS, AAM.AS B.V, USD, XAMS/ENA-MAIN, 432] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.L, vpSize 0, data [AAN.L, AAN.L London PLC, USD, XLON/LSE-SETS, 80] -17:29:26.990 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.N, vpSize 0, data [AAN.N, AAN.N Corporation, CAD, XNGS/NAS-GSM, 903] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.OQ, vpSize 0, data [AAN.OQ, AAN.OQ Co., EUR, XNYS/NYS-MAIN, 206] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.AS, vpSize 0, data [AAN.AS, AAN.AS B.V, USD, XAMS/ENA-MAIN, 911] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.L, vpSize 0, data [AAO.L, AAO.L London PLC, CAD, XLON/LSE-SETS, 356] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.N, vpSize 0, data [AAO.N, AAO.N Corporation, EUR, XNGS/NAS-GSM, 211] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.OQ, vpSize 0, data [AAO.OQ, AAO.OQ Co., CAD, XNYS/NYS-MAIN, 310] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.AS, vpSize 0, data [AAO.AS, AAO.AS B.V, USD, XAMS/ENA-MAIN, 654] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.L, vpSize 0, data [AAP.L, AAP.L London PLC, USD, XLON/LSE-SETS, 169] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.N, vpSize 0, data [AAP.N, AAP.N Corporation, USD, XNGS/NAS-GSM, 408] -17:29:26.991 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.OQ, vpSize 0, data [AAP.OQ, AAP.OQ Co., GBX, XNYS/NYS-MAIN, 706] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.AS, vpSize 0, data [AAP.AS, AAP.AS B.V, USD, XAMS/ENA-MAIN, 892] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.L, vpSize 0, data [AAQ.L, AAQ.L London PLC, EUR, XLON/LSE-SETS, 568] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.N, vpSize 0, data [AAQ.N, AAQ.N Corporation, EUR, XNGS/NAS-GSM, 313] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.OQ, vpSize 0, data [AAQ.OQ, AAQ.OQ Co., USD, XNYS/NYS-MAIN, 607] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.AS, vpSize 0, data [AAQ.AS, AAQ.AS B.V, CAD, XAMS/ENA-MAIN, 451] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.L, vpSize 0, data [AAR.L, AAR.L London PLC, GBX, XLON/LSE-SETS, 346] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.N, vpSize 0, data [AAR.N, AAR.N Corporation, GBX, XNGS/NAS-GSM, 717] -17:29:26.992 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.OQ, vpSize 0, data [AAR.OQ, AAR.OQ Co., CAD, XNYS/NYS-MAIN, 404] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.AS, vpSize 0, data [AAR.AS, AAR.AS B.V, GBX, XAMS/ENA-MAIN, 606] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.L, vpSize 0, data [AAS.L, AAS.L London PLC, USD, XLON/LSE-SETS, 19] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.N, vpSize 0, data [AAS.N, AAS.N Corporation, GBX, XNGS/NAS-GSM, 429] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.OQ, vpSize 0, data [AAS.OQ, AAS.OQ Co., EUR, XNYS/NYS-MAIN, 170] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.AS, vpSize 0, data [AAS.AS, AAS.AS B.V, GBX, XAMS/ENA-MAIN, 234] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.L, vpSize 0, data [AAT.L, AAT.L London PLC, CAD, XLON/LSE-SETS, 202] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.N, vpSize 0, data [AAT.N, AAT.N Corporation, USD, XNGS/NAS-GSM, 426] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.OQ, vpSize 0, data [AAT.OQ, AAT.OQ Co., EUR, XNYS/NYS-MAIN, 444] -17:29:26.993 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.AS, vpSize 0, data [AAT.AS, AAT.AS B.V, CAD, XAMS/ENA-MAIN, 134] -17:29:26.994 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.L, vpSize 0, data [AAU.L, AAU.L London PLC, GBX, XLON/LSE-SETS, 517] -17:29:26.994 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.N, vpSize 0, data [AAU.N, AAU.N Corporation, GBX, XNGS/NAS-GSM, 169] -17:29:27.011 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.OQ, vpSize 0, data [AAU.OQ, AAU.OQ Co., EUR, XNYS/NYS-MAIN, 750] -17:29:27.011 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.AS, vpSize 0, data [AAU.AS, AAU.AS B.V, USD, XAMS/ENA-MAIN, 676] -17:29:27.011 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.L, vpSize 0, data [AAV.L, AAV.L London PLC, CAD, XLON/LSE-SETS, 823] -17:29:27.012 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.N, vpSize 0, data [AAV.N, AAV.N Corporation, EUR, XNGS/NAS-GSM, 768] -17:29:27.012 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.OQ, vpSize 0, data [AAV.OQ, AAV.OQ Co., EUR, XNYS/NYS-MAIN, 856] -17:29:27.012 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.AS, vpSize 0, data [AAV.AS, AAV.AS B.V, GBX, XAMS/ENA-MAIN, 120] -17:29:27.012 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.L, vpSize 0, data [AAW.L, AAW.L London PLC, USD, XLON/LSE-SETS, 900] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.N, vpSize 0, data [AAW.N, AAW.N Corporation, CAD, XNGS/NAS-GSM, 48] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.OQ, vpSize 0, data [AAW.OQ, AAW.OQ Co., USD, XNYS/NYS-MAIN, 818] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.AS, vpSize 0, data [AAW.AS, AAW.AS B.V, USD, XAMS/ENA-MAIN, 581] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.L, vpSize 0, data [AAX.L, AAX.L London PLC, GBX, XLON/LSE-SETS, 761] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.N, vpSize 0, data [AAX.N, AAX.N Corporation, CAD, XNGS/NAS-GSM, 435] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.OQ, vpSize 0, data [AAX.OQ, AAX.OQ Co., EUR, XNYS/NYS-MAIN, 407] -17:29:27.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.AS, vpSize 0, data [AAX.AS, AAX.AS B.V, GBX, XAMS/ENA-MAIN, 269] -17:29:27.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.L, vpSize 0, data [AAY.L, AAY.L London PLC, EUR, XLON/LSE-SETS, 774] -17:29:27.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.N, vpSize 0, data [AAY.N, AAY.N Corporation, USD, XNGS/NAS-GSM, 44] -17:29:27.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.OQ, vpSize 0, data [AAY.OQ, AAY.OQ Co., EUR, XNYS/NYS-MAIN, 828] -17:29:27.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.AS, vpSize 0, data [AAY.AS, AAY.AS B.V, EUR, XAMS/ENA-MAIN, 767] -17:29:31.295 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:36.435 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:41.509 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:46.583 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:51.684 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:29:56.780 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:01.832 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:06.928 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:12.037 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:17.137 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:22.207 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:27.354 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:32.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:37.590 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:42.771 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:47.959 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:53.108 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:30:58.354 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:03.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:08.497 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:13.600 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:18.649 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:23.741 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:28.842 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:33.918 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:39.018 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:44.123 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:49.445 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:54.540 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:31:59.685 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:04.826 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:09.892 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:14.948 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:19.996 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:25.157 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:30.291 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:35.339 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:40.475 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:45.617 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:50.721 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:32:55.765 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:00.856 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:05.973 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:11.071 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:16.154 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:21.240 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:26.315 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:31.384 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:36.506 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:41.866 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:46.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:52.095 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:33:57.128 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:02.627 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:07.787 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:12.914 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:18.008 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:23.065 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:28.185 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:33.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:38.363 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:43.550 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:48.647 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:53.773 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:34:58.905 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:04.086 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:09.147 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:14.240 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:19.270 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:24.352 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:29.416 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:34.529 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:39.656 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:44.767 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:54.875 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:35:59.956 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:05.074 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:10.107 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:15.247 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:20.332 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:25.432 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:30.528 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:35.574 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:40.604 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:45.721 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:50.772 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:36:55.937 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:01.037 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:06.146 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:11.253 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:16.490 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:21.637 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:26.728 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:31.803 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:36.891 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:41.974 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:47.036 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:52.128 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:37:57.182 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:02.229 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:07.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:12.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:17.399 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:22.483 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:27.565 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:32.657 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:37.718 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:42.818 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:47.935 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:53.037 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:38:58.199 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:03.279 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:08.403 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:13.493 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:18.592 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:23.690 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:28.758 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:33.826 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:38.912 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -17:39:43.941 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] diff --git a/vuu/src/main/resources/issue/size.set.vuu.log b/vuu/src/main/resources/issue/size.set.vuu.log deleted file mode 100644 index 63de85769..000000000 --- a/vuu/src/main/resources/issue/size.set.vuu.log +++ /dev/null @@ -1,1010 +0,0 @@ -09:22:41.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [AUTH] success -09:22:41.522 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [LOGIN] success UserPrincipal(user,4af3f8d4-2896-4175-aa9a-e71b68d315ee,63a828d2-9154-4382-8d94-fab48a0e79b6) -09:22:41.653 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - TABLELIST -09:22:41.743 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [HB] -09:22:41.833 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [TABLEMETA] orderEntry from server -09:22:43.701 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [TABLEMETA] instruments from server -09:22:45.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Create Success -09:22:46.298 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 100 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:46.300 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.L, vpSize 70304, data [AAA.L, AAA.L London PLC, USD, XLON/LSE-SETS, 633] -09:22:46.301 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.N, vpSize 70304, data [AAA.N, AAA.N Corporation, EUR, XNGS/NAS-GSM, 220] -09:22:46.301 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.OQ, vpSize 70304, data [AAA.OQ, AAA.OQ Co., EUR, XNYS/NYS-MAIN, 393] -09:22:46.302 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.AS, vpSize 70304, data [AAA.AS, AAA.AS B.V, GBX, XAMS/ENA-MAIN, 449] -09:22:46.302 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.L, vpSize 70304, data [AAB.L, AAB.L London PLC, GBX, XLON/LSE-SETS, 37] -09:22:46.302 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.N, vpSize 70304, data [AAB.N, AAB.N Corporation, CAD, XNGS/NAS-GSM, 38] -09:22:46.303 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.OQ, vpSize 70304, data [AAB.OQ, AAB.OQ Co., GBX, XNYS/NYS-MAIN, 286] -09:22:46.304 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.AS, vpSize 70304, data [AAB.AS, AAB.AS B.V, USD, XAMS/ENA-MAIN, 364] -09:22:46.305 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.L, vpSize 70304, data [AAC.L, AAC.L London PLC, EUR, XLON/LSE-SETS, 12] -09:22:46.306 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.N, vpSize 70304, data [AAC.N, AAC.N Corporation, CAD, XNGS/NAS-GSM, 927] -09:22:46.307 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.OQ, vpSize 70304, data [AAC.OQ, AAC.OQ Co., GBX, XNYS/NYS-MAIN, 559] -09:22:46.307 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.AS, vpSize 70304, data [AAC.AS, AAC.AS B.V, CAD, XAMS/ENA-MAIN, 946] -09:22:46.307 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.L, vpSize 70304, data [AAD.L, AAD.L London PLC, CAD, XLON/LSE-SETS, 363] -09:22:46.308 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.N, vpSize 70304, data [AAD.N, AAD.N Corporation, CAD, XNGS/NAS-GSM, 696] -09:22:46.308 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.OQ, vpSize 70304, data [AAD.OQ, AAD.OQ Co., EUR, XNYS/NYS-MAIN, 806] -09:22:46.308 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.AS, vpSize 70304, data [AAD.AS, AAD.AS B.V, GBX, XAMS/ENA-MAIN, 44] -09:22:46.308 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.L, vpSize 70304, data [AAE.L, AAE.L London PLC, GBX, XLON/LSE-SETS, 226] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.N, vpSize 70304, data [AAE.N, AAE.N Corporation, GBX, XNGS/NAS-GSM, 54] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.OQ, vpSize 70304, data [AAE.OQ, AAE.OQ Co., USD, XNYS/NYS-MAIN, 618] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.AS, vpSize 70304, data [AAE.AS, AAE.AS B.V, CAD, XAMS/ENA-MAIN, 643] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.L, vpSize 70304, data [AAF.L, AAF.L London PLC, GBX, XLON/LSE-SETS, 690] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.N, vpSize 70304, data [AAF.N, AAF.N Corporation, CAD, XNGS/NAS-GSM, 623] -09:22:46.309 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.OQ, vpSize 70304, data [AAF.OQ, AAF.OQ Co., USD, XNYS/NYS-MAIN, 167] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.AS, vpSize 70304, data [AAF.AS, AAF.AS B.V, EUR, XAMS/ENA-MAIN, 410] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.L, vpSize 70304, data [AAG.L, AAG.L London PLC, EUR, XLON/LSE-SETS, 928] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.N, vpSize 70304, data [AAG.N, AAG.N Corporation, GBX, XNGS/NAS-GSM, 900] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.OQ, vpSize 70304, data [AAG.OQ, AAG.OQ Co., CAD, XNYS/NYS-MAIN, 896] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.AS, vpSize 70304, data [AAG.AS, AAG.AS B.V, USD, XAMS/ENA-MAIN, 934] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.L, vpSize 70304, data [AAH.L, AAH.L London PLC, USD, XLON/LSE-SETS, 553] -09:22:46.310 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.N, vpSize 70304, data [AAH.N, AAH.N Corporation, EUR, XNGS/NAS-GSM, 879] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.OQ, vpSize 70304, data [AAH.OQ, AAH.OQ Co., GBX, XNYS/NYS-MAIN, 943] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.AS, vpSize 70304, data [AAH.AS, AAH.AS B.V, GBX, XAMS/ENA-MAIN, 303] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.L, vpSize 70304, data [AAI.L, AAI.L London PLC, CAD, XLON/LSE-SETS, 430] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.N, vpSize 70304, data [AAI.N, AAI.N Corporation, EUR, XNGS/NAS-GSM, 628] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.OQ, vpSize 70304, data [AAI.OQ, AAI.OQ Co., CAD, XNYS/NYS-MAIN, 720] -09:22:46.311 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.AS, vpSize 70304, data [AAI.AS, AAI.AS B.V, EUR, XAMS/ENA-MAIN, 478] -09:22:46.312 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.L, vpSize 70304, data [AAJ.L, AAJ.L London PLC, CAD, XLON/LSE-SETS, 759] -09:22:46.312 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.N, vpSize 70304, data [AAJ.N, AAJ.N Corporation, GBX, XNGS/NAS-GSM, 697] -09:22:46.312 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.OQ, vpSize 70304, data [AAJ.OQ, AAJ.OQ Co., EUR, XNYS/NYS-MAIN, 68] -09:22:46.312 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.AS, vpSize 70304, data [AAJ.AS, AAJ.AS B.V, GBX, XAMS/ENA-MAIN, 199] -09:22:46.312 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.L, vpSize 70304, data [AAK.L, AAK.L London PLC, USD, XLON/LSE-SETS, 873] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.N, vpSize 70304, data [AAK.N, AAK.N Corporation, EUR, XNGS/NAS-GSM, 951] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.OQ, vpSize 70304, data [AAK.OQ, AAK.OQ Co., EUR, XNYS/NYS-MAIN, 793] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.AS, vpSize 70304, data [AAK.AS, AAK.AS B.V, USD, XAMS/ENA-MAIN, 382] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.L, vpSize 70304, data [AAL.L, AAL.L London PLC, GBX, XLON/LSE-SETS, 578] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.N, vpSize 70304, data [AAL.N, AAL.N Corporation, CAD, XNGS/NAS-GSM, 328] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.OQ, vpSize 70304, data [AAL.OQ, AAL.OQ Co., EUR, XNYS/NYS-MAIN, 76] -09:22:46.313 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.AS, vpSize 70304, data [AAL.AS, AAL.AS B.V, CAD, XAMS/ENA-MAIN, 691] -09:22:46.314 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.L, vpSize 70304, data [AAM.L, AAM.L London PLC, GBX, XLON/LSE-SETS, 161] -09:22:46.314 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.N, vpSize 70304, data [AAM.N, AAM.N Corporation, CAD, XNGS/NAS-GSM, 57] -09:22:46.314 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.OQ, vpSize 70304, data [AAM.OQ, AAM.OQ Co., CAD, XNYS/NYS-MAIN, 201] -09:22:46.333 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.AS, vpSize 70304, data [AAM.AS, AAM.AS B.V, USD, XAMS/ENA-MAIN, 432] -09:22:46.333 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.L, vpSize 70304, data [AAN.L, AAN.L London PLC, USD, XLON/LSE-SETS, 80] -09:22:46.333 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.N, vpSize 70304, data [AAN.N, AAN.N Corporation, CAD, XNGS/NAS-GSM, 903] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.OQ, vpSize 70304, data [AAN.OQ, AAN.OQ Co., EUR, XNYS/NYS-MAIN, 206] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.AS, vpSize 70304, data [AAN.AS, AAN.AS B.V, USD, XAMS/ENA-MAIN, 911] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.L, vpSize 70304, data [AAO.L, AAO.L London PLC, CAD, XLON/LSE-SETS, 356] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.N, vpSize 70304, data [AAO.N, AAO.N Corporation, EUR, XNGS/NAS-GSM, 211] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.OQ, vpSize 70304, data [AAO.OQ, AAO.OQ Co., CAD, XNYS/NYS-MAIN, 310] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.AS, vpSize 70304, data [AAO.AS, AAO.AS B.V, USD, XAMS/ENA-MAIN, 654] -09:22:46.334 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.L, vpSize 70304, data [AAP.L, AAP.L London PLC, USD, XLON/LSE-SETS, 169] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.N, vpSize 70304, data [AAP.N, AAP.N Corporation, USD, XNGS/NAS-GSM, 408] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.OQ, vpSize 70304, data [AAP.OQ, AAP.OQ Co., GBX, XNYS/NYS-MAIN, 706] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.AS, vpSize 70304, data [AAP.AS, AAP.AS B.V, USD, XAMS/ENA-MAIN, 892] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.L, vpSize 70304, data [AAQ.L, AAQ.L London PLC, EUR, XLON/LSE-SETS, 568] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.N, vpSize 70304, data [AAQ.N, AAQ.N Corporation, EUR, XNGS/NAS-GSM, 313] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.OQ, vpSize 70304, data [AAQ.OQ, AAQ.OQ Co., USD, XNYS/NYS-MAIN, 607] -09:22:46.335 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.AS, vpSize 70304, data [AAQ.AS, AAQ.AS B.V, CAD, XAMS/ENA-MAIN, 451] -09:22:46.336 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.L, vpSize 70304, data [AAR.L, AAR.L London PLC, GBX, XLON/LSE-SETS, 346] -09:22:46.336 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.N, vpSize 70304, data [AAR.N, AAR.N Corporation, GBX, XNGS/NAS-GSM, 717] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.OQ, vpSize 70304, data [AAR.OQ, AAR.OQ Co., CAD, XNYS/NYS-MAIN, 404] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.AS, vpSize 70304, data [AAR.AS, AAR.AS B.V, GBX, XAMS/ENA-MAIN, 606] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.L, vpSize 70304, data [AAS.L, AAS.L London PLC, USD, XLON/LSE-SETS, 19] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.N, vpSize 70304, data [AAS.N, AAS.N Corporation, GBX, XNGS/NAS-GSM, 429] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.OQ, vpSize 70304, data [AAS.OQ, AAS.OQ Co., EUR, XNYS/NYS-MAIN, 170] -09:22:46.337 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.AS, vpSize 70304, data [AAS.AS, AAS.AS B.V, GBX, XAMS/ENA-MAIN, 234] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.L, vpSize 70304, data [AAT.L, AAT.L London PLC, CAD, XLON/LSE-SETS, 202] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.N, vpSize 70304, data [AAT.N, AAT.N Corporation, USD, XNGS/NAS-GSM, 426] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.OQ, vpSize 70304, data [AAT.OQ, AAT.OQ Co., EUR, XNYS/NYS-MAIN, 444] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.AS, vpSize 70304, data [AAT.AS, AAT.AS B.V, CAD, XAMS/ENA-MAIN, 134] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.L, vpSize 70304, data [AAU.L, AAU.L London PLC, GBX, XLON/LSE-SETS, 517] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.N, vpSize 70304, data [AAU.N, AAU.N Corporation, GBX, XNGS/NAS-GSM, 169] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.OQ, vpSize 70304, data [AAU.OQ, AAU.OQ Co., EUR, XNYS/NYS-MAIN, 750] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.AS, vpSize 70304, data [AAU.AS, AAU.AS B.V, USD, XAMS/ENA-MAIN, 676] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.L, vpSize 70304, data [AAV.L, AAV.L London PLC, CAD, XLON/LSE-SETS, 823] -09:22:46.338 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.N, vpSize 70304, data [AAV.N, AAV.N Corporation, EUR, XNGS/NAS-GSM, 768] -09:22:46.345 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.OQ, vpSize 70304, data [AAV.OQ, AAV.OQ Co., EUR, XNYS/NYS-MAIN, 856] -09:22:46.345 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.AS, vpSize 70304, data [AAV.AS, AAV.AS B.V, GBX, XAMS/ENA-MAIN, 120] -09:22:46.345 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.L, vpSize 70304, data [AAW.L, AAW.L London PLC, USD, XLON/LSE-SETS, 900] -09:22:46.345 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.N, vpSize 70304, data [AAW.N, AAW.N Corporation, CAD, XNGS/NAS-GSM, 48] -09:22:46.345 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.OQ, vpSize 70304, data [AAW.OQ, AAW.OQ Co., USD, XNYS/NYS-MAIN, 818] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.AS, vpSize 70304, data [AAW.AS, AAW.AS B.V, USD, XAMS/ENA-MAIN, 581] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.L, vpSize 70304, data [AAX.L, AAX.L London PLC, GBX, XLON/LSE-SETS, 761] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.N, vpSize 70304, data [AAX.N, AAX.N Corporation, CAD, XNGS/NAS-GSM, 435] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.OQ, vpSize 70304, data [AAX.OQ, AAX.OQ Co., EUR, XNYS/NYS-MAIN, 407] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.AS, vpSize 70304, data [AAX.AS, AAX.AS B.V, GBX, XAMS/ENA-MAIN, 269] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.L, vpSize 70304, data [AAY.L, AAY.L London PLC, EUR, XLON/LSE-SETS, 774] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.N, vpSize 70304, data [AAY.N, AAY.N Corporation, USD, XNGS/NAS-GSM, 44] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.OQ, vpSize 70304, data [AAY.OQ, AAY.OQ Co., EUR, XNYS/NYS-MAIN, 828] -09:22:46.346 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.AS, vpSize 70304, data [AAY.AS, AAY.AS B.V, EUR, XAMS/ENA-MAIN, 767] -09:22:49.636 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 0 to 134 -09:22:49.723 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 0->134 -09:22:49.788 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 134 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:49.789 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.L, vpSize 70304, data [AAA.L, AAA.L London PLC, USD, XLON/LSE-SETS, 633] -09:22:49.789 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.N, vpSize 70304, data [AAA.N, AAA.N Corporation, EUR, XNGS/NAS-GSM, 220] -09:22:49.789 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.OQ, vpSize 70304, data [AAA.OQ, AAA.OQ Co., EUR, XNYS/NYS-MAIN, 393] -09:22:49.789 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.AS, vpSize 70304, data [AAA.AS, AAA.AS B.V, GBX, XAMS/ENA-MAIN, 449] -09:22:49.789 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.L, vpSize 70304, data [AAB.L, AAB.L London PLC, GBX, XLON/LSE-SETS, 37] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.N, vpSize 70304, data [AAB.N, AAB.N Corporation, CAD, XNGS/NAS-GSM, 38] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.OQ, vpSize 70304, data [AAB.OQ, AAB.OQ Co., GBX, XNYS/NYS-MAIN, 286] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.AS, vpSize 70304, data [AAB.AS, AAB.AS B.V, USD, XAMS/ENA-MAIN, 364] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.L, vpSize 70304, data [AAC.L, AAC.L London PLC, EUR, XLON/LSE-SETS, 12] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.N, vpSize 70304, data [AAC.N, AAC.N Corporation, CAD, XNGS/NAS-GSM, 927] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.OQ, vpSize 70304, data [AAC.OQ, AAC.OQ Co., GBX, XNYS/NYS-MAIN, 559] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.AS, vpSize 70304, data [AAC.AS, AAC.AS B.V, CAD, XAMS/ENA-MAIN, 946] -09:22:49.790 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.L, vpSize 70304, data [AAD.L, AAD.L London PLC, CAD, XLON/LSE-SETS, 363] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.N, vpSize 70304, data [AAD.N, AAD.N Corporation, CAD, XNGS/NAS-GSM, 696] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.OQ, vpSize 70304, data [AAD.OQ, AAD.OQ Co., EUR, XNYS/NYS-MAIN, 806] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.AS, vpSize 70304, data [AAD.AS, AAD.AS B.V, GBX, XAMS/ENA-MAIN, 44] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.L, vpSize 70304, data [AAE.L, AAE.L London PLC, GBX, XLON/LSE-SETS, 226] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.N, vpSize 70304, data [AAE.N, AAE.N Corporation, GBX, XNGS/NAS-GSM, 54] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.OQ, vpSize 70304, data [AAE.OQ, AAE.OQ Co., USD, XNYS/NYS-MAIN, 618] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.AS, vpSize 70304, data [AAE.AS, AAE.AS B.V, CAD, XAMS/ENA-MAIN, 643] -09:22:49.791 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.L, vpSize 70304, data [AAF.L, AAF.L London PLC, GBX, XLON/LSE-SETS, 690] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.N, vpSize 70304, data [AAF.N, AAF.N Corporation, CAD, XNGS/NAS-GSM, 623] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.OQ, vpSize 70304, data [AAF.OQ, AAF.OQ Co., USD, XNYS/NYS-MAIN, 167] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.AS, vpSize 70304, data [AAF.AS, AAF.AS B.V, EUR, XAMS/ENA-MAIN, 410] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.L, vpSize 70304, data [AAG.L, AAG.L London PLC, EUR, XLON/LSE-SETS, 928] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.N, vpSize 70304, data [AAG.N, AAG.N Corporation, GBX, XNGS/NAS-GSM, 900] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.OQ, vpSize 70304, data [AAG.OQ, AAG.OQ Co., CAD, XNYS/NYS-MAIN, 896] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.AS, vpSize 70304, data [AAG.AS, AAG.AS B.V, USD, XAMS/ENA-MAIN, 934] -09:22:49.792 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.L, vpSize 70304, data [AAH.L, AAH.L London PLC, USD, XLON/LSE-SETS, 553] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.N, vpSize 70304, data [AAH.N, AAH.N Corporation, EUR, XNGS/NAS-GSM, 879] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.OQ, vpSize 70304, data [AAH.OQ, AAH.OQ Co., GBX, XNYS/NYS-MAIN, 943] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.AS, vpSize 70304, data [AAH.AS, AAH.AS B.V, GBX, XAMS/ENA-MAIN, 303] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.L, vpSize 70304, data [AAI.L, AAI.L London PLC, CAD, XLON/LSE-SETS, 430] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.N, vpSize 70304, data [AAI.N, AAI.N Corporation, EUR, XNGS/NAS-GSM, 628] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.OQ, vpSize 70304, data [AAI.OQ, AAI.OQ Co., CAD, XNYS/NYS-MAIN, 720] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.AS, vpSize 70304, data [AAI.AS, AAI.AS B.V, EUR, XAMS/ENA-MAIN, 478] -09:22:49.793 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.L, vpSize 70304, data [AAJ.L, AAJ.L London PLC, CAD, XLON/LSE-SETS, 759] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.N, vpSize 70304, data [AAJ.N, AAJ.N Corporation, GBX, XNGS/NAS-GSM, 697] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.OQ, vpSize 70304, data [AAJ.OQ, AAJ.OQ Co., EUR, XNYS/NYS-MAIN, 68] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.AS, vpSize 70304, data [AAJ.AS, AAJ.AS B.V, GBX, XAMS/ENA-MAIN, 199] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.L, vpSize 70304, data [AAK.L, AAK.L London PLC, USD, XLON/LSE-SETS, 873] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.N, vpSize 70304, data [AAK.N, AAK.N Corporation, EUR, XNGS/NAS-GSM, 951] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.OQ, vpSize 70304, data [AAK.OQ, AAK.OQ Co., EUR, XNYS/NYS-MAIN, 793] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.AS, vpSize 70304, data [AAK.AS, AAK.AS B.V, USD, XAMS/ENA-MAIN, 382] -09:22:49.794 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.L, vpSize 70304, data [AAL.L, AAL.L London PLC, GBX, XLON/LSE-SETS, 578] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.N, vpSize 70304, data [AAL.N, AAL.N Corporation, CAD, XNGS/NAS-GSM, 328] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.OQ, vpSize 70304, data [AAL.OQ, AAL.OQ Co., EUR, XNYS/NYS-MAIN, 76] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.AS, vpSize 70304, data [AAL.AS, AAL.AS B.V, CAD, XAMS/ENA-MAIN, 691] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.L, vpSize 70304, data [AAM.L, AAM.L London PLC, GBX, XLON/LSE-SETS, 161] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.N, vpSize 70304, data [AAM.N, AAM.N Corporation, CAD, XNGS/NAS-GSM, 57] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.OQ, vpSize 70304, data [AAM.OQ, AAM.OQ Co., CAD, XNYS/NYS-MAIN, 201] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.AS, vpSize 70304, data [AAM.AS, AAM.AS B.V, USD, XAMS/ENA-MAIN, 432] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.L, vpSize 70304, data [AAN.L, AAN.L London PLC, USD, XLON/LSE-SETS, 80] -09:22:49.795 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.N, vpSize 70304, data [AAN.N, AAN.N Corporation, CAD, XNGS/NAS-GSM, 903] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.OQ, vpSize 70304, data [AAN.OQ, AAN.OQ Co., EUR, XNYS/NYS-MAIN, 206] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.AS, vpSize 70304, data [AAN.AS, AAN.AS B.V, USD, XAMS/ENA-MAIN, 911] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.L, vpSize 70304, data [AAO.L, AAO.L London PLC, CAD, XLON/LSE-SETS, 356] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.N, vpSize 70304, data [AAO.N, AAO.N Corporation, EUR, XNGS/NAS-GSM, 211] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.OQ, vpSize 70304, data [AAO.OQ, AAO.OQ Co., CAD, XNYS/NYS-MAIN, 310] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.AS, vpSize 70304, data [AAO.AS, AAO.AS B.V, USD, XAMS/ENA-MAIN, 654] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.L, vpSize 70304, data [AAP.L, AAP.L London PLC, USD, XLON/LSE-SETS, 169] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.N, vpSize 70304, data [AAP.N, AAP.N Corporation, USD, XNGS/NAS-GSM, 408] -09:22:49.796 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.OQ, vpSize 70304, data [AAP.OQ, AAP.OQ Co., GBX, XNYS/NYS-MAIN, 706] -09:22:49.797 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.AS, vpSize 70304, data [AAP.AS, AAP.AS B.V, USD, XAMS/ENA-MAIN, 892] -09:22:49.797 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.L, vpSize 70304, data [AAQ.L, AAQ.L London PLC, EUR, XLON/LSE-SETS, 568] -09:22:49.797 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.N, vpSize 70304, data [AAQ.N, AAQ.N Corporation, EUR, XNGS/NAS-GSM, 313] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.OQ, vpSize 70304, data [AAQ.OQ, AAQ.OQ Co., USD, XNYS/NYS-MAIN, 607] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.AS, vpSize 70304, data [AAQ.AS, AAQ.AS B.V, CAD, XAMS/ENA-MAIN, 451] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.L, vpSize 70304, data [AAR.L, AAR.L London PLC, GBX, XLON/LSE-SETS, 346] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.N, vpSize 70304, data [AAR.N, AAR.N Corporation, GBX, XNGS/NAS-GSM, 717] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.OQ, vpSize 70304, data [AAR.OQ, AAR.OQ Co., CAD, XNYS/NYS-MAIN, 404] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.AS, vpSize 70304, data [AAR.AS, AAR.AS B.V, GBX, XAMS/ENA-MAIN, 606] -09:22:49.804 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.L, vpSize 70304, data [AAS.L, AAS.L London PLC, USD, XLON/LSE-SETS, 19] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.N, vpSize 70304, data [AAS.N, AAS.N Corporation, GBX, XNGS/NAS-GSM, 429] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.OQ, vpSize 70304, data [AAS.OQ, AAS.OQ Co., EUR, XNYS/NYS-MAIN, 170] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.AS, vpSize 70304, data [AAS.AS, AAS.AS B.V, GBX, XAMS/ENA-MAIN, 234] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.L, vpSize 70304, data [AAT.L, AAT.L London PLC, CAD, XLON/LSE-SETS, 202] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.N, vpSize 70304, data [AAT.N, AAT.N Corporation, USD, XNGS/NAS-GSM, 426] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.OQ, vpSize 70304, data [AAT.OQ, AAT.OQ Co., EUR, XNYS/NYS-MAIN, 444] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.AS, vpSize 70304, data [AAT.AS, AAT.AS B.V, CAD, XAMS/ENA-MAIN, 134] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.L, vpSize 70304, data [AAU.L, AAU.L London PLC, GBX, XLON/LSE-SETS, 517] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.N, vpSize 70304, data [AAU.N, AAU.N Corporation, GBX, XNGS/NAS-GSM, 169] -09:22:49.805 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.OQ, vpSize 70304, data [AAU.OQ, AAU.OQ Co., EUR, XNYS/NYS-MAIN, 750] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.AS, vpSize 70304, data [AAU.AS, AAU.AS B.V, USD, XAMS/ENA-MAIN, 676] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.L, vpSize 70304, data [AAV.L, AAV.L London PLC, CAD, XLON/LSE-SETS, 823] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.N, vpSize 70304, data [AAV.N, AAV.N Corporation, EUR, XNGS/NAS-GSM, 768] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.OQ, vpSize 70304, data [AAV.OQ, AAV.OQ Co., EUR, XNYS/NYS-MAIN, 856] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.AS, vpSize 70304, data [AAV.AS, AAV.AS B.V, GBX, XAMS/ENA-MAIN, 120] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.L, vpSize 70304, data [AAW.L, AAW.L London PLC, USD, XLON/LSE-SETS, 900] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.N, vpSize 70304, data [AAW.N, AAW.N Corporation, CAD, XNGS/NAS-GSM, 48] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.OQ, vpSize 70304, data [AAW.OQ, AAW.OQ Co., USD, XNYS/NYS-MAIN, 818] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.AS, vpSize 70304, data [AAW.AS, AAW.AS B.V, USD, XAMS/ENA-MAIN, 581] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.L, vpSize 70304, data [AAX.L, AAX.L London PLC, GBX, XLON/LSE-SETS, 761] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.N, vpSize 70304, data [AAX.N, AAX.N Corporation, CAD, XNGS/NAS-GSM, 435] -09:22:49.806 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.OQ, vpSize 70304, data [AAX.OQ, AAX.OQ Co., EUR, XNYS/NYS-MAIN, 407] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.AS, vpSize 70304, data [AAX.AS, AAX.AS B.V, GBX, XAMS/ENA-MAIN, 269] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.L, vpSize 70304, data [AAY.L, AAY.L London PLC, EUR, XLON/LSE-SETS, 774] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.N, vpSize 70304, data [AAY.N, AAY.N Corporation, USD, XNGS/NAS-GSM, 44] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.OQ, vpSize 70304, data [AAY.OQ, AAY.OQ Co., EUR, XNYS/NYS-MAIN, 828] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.AS, vpSize 70304, data [AAY.AS, AAY.AS B.V, EUR, XAMS/ENA-MAIN, 767] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.L, vpSize 70304, data [AAZ.L, AAZ.L London PLC, EUR, XLON/LSE-SETS, 637] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.N, vpSize 70304, data [AAZ.N, AAZ.N Corporation, GBX, XNGS/NAS-GSM, 44] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.OQ, vpSize 70304, data [AAZ.OQ, AAZ.OQ Co., USD, XNYS/NYS-MAIN, 647] -09:22:49.807 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.AS, vpSize 70304, data [AAZ.AS, AAZ.AS B.V, USD, XAMS/ENA-MAIN, 312] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.L, vpSize 70304, data [ABA.L, ABA.L London PLC, GBX, XLON/LSE-SETS, 914] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.N, vpSize 70304, data [ABA.N, ABA.N Corporation, CAD, XNGS/NAS-GSM, 568] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.OQ, vpSize 70304, data [ABA.OQ, ABA.OQ Co., EUR, XNYS/NYS-MAIN, 66] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.AS, vpSize 70304, data [ABA.AS, ABA.AS B.V, CAD, XAMS/ENA-MAIN, 325] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.L, vpSize 70304, data [ABB.L, ABB.L London PLC, EUR, XLON/LSE-SETS, 322] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.N, vpSize 70304, data [ABB.N, ABB.N Corporation, USD, XNGS/NAS-GSM, 126] -09:22:49.808 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.OQ, vpSize 70304, data [ABB.OQ, ABB.OQ Co., GBX, XNYS/NYS-MAIN, 351] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.AS, vpSize 70304, data [ABB.AS, ABB.AS B.V, CAD, XAMS/ENA-MAIN, 524] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.L, vpSize 70304, data [ABC.L, ABC.L London PLC, EUR, XLON/LSE-SETS, 686] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.N, vpSize 70304, data [ABC.N, ABC.N Corporation, CAD, XNGS/NAS-GSM, 751] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.OQ, vpSize 70304, data [ABC.OQ, ABC.OQ Co., CAD, XNYS/NYS-MAIN, 283] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.AS, vpSize 70304, data [ABC.AS, ABC.AS B.V, CAD, XAMS/ENA-MAIN, 888] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.L, vpSize 70304, data [ABD.L, ABD.L London PLC, EUR, XLON/LSE-SETS, 895] -09:22:49.809 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.N, vpSize 70304, data [ABD.N, ABD.N Corporation, USD, XNGS/NAS-GSM, 107] -09:22:49.810 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.OQ, vpSize 70304, data [ABD.OQ, ABD.OQ Co., GBX, XNYS/NYS-MAIN, 269] -09:22:49.810 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.AS, vpSize 70304, data [ABD.AS, ABD.AS B.V, GBX, XAMS/ENA-MAIN, 308] -09:22:49.810 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.L, vpSize 70304, data [ABE.L, ABE.L London PLC, EUR, XLON/LSE-SETS, 137] -09:22:49.811 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.N, vpSize 70304, data [ABE.N, ABE.N Corporation, GBX, XNGS/NAS-GSM, 730] -09:22:49.811 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.OQ, vpSize 70304, data [ABE.OQ, ABE.OQ Co., USD, XNYS/NYS-MAIN, 509] -09:22:49.811 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.AS, vpSize 70304, data [ABE.AS, ABE.AS B.V, USD, XAMS/ENA-MAIN, 852] -09:22:49.812 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.L, vpSize 70304, data [ABF.L, ABF.L London PLC, EUR, XLON/LSE-SETS, 50] -09:22:49.814 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.N, vpSize 70304, data [ABF.N, ABF.N Corporation, CAD, XNGS/NAS-GSM, 943] -09:22:49.814 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.OQ, vpSize 70304, data [ABF.OQ, ABF.OQ Co., GBX, XNYS/NYS-MAIN, 95] -09:22:49.814 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.AS, vpSize 70304, data [ABF.AS, ABF.AS B.V, GBX, XAMS/ENA-MAIN, 937] -09:22:49.814 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.L, vpSize 70304, data [ABG.L, ABG.L London PLC, USD, XLON/LSE-SETS, 377] -09:22:49.823 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.N, vpSize 70304, data [ABG.N, ABG.N Corporation, GBX, XNGS/NAS-GSM, 917] -09:22:49.823 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.OQ, vpSize 70304, data [ABG.OQ, ABG.OQ Co., EUR, XNYS/NYS-MAIN, 703] -09:22:49.823 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.AS, vpSize 70304, data [ABG.AS, ABG.AS B.V, CAD, XAMS/ENA-MAIN, 243] -09:22:49.823 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.L, vpSize 70304, data [ABH.L, ABH.L London PLC, USD, XLON/LSE-SETS, 785] -09:22:49.863 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.N, vpSize 70304, data [ABH.N, ABH.N Corporation, USD, XNGS/NAS-GSM, 443] -09:22:49.968 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 11 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:49.968 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.L, vpSize 70304, data [AAZ.L, AAZ.L London PLC, EUR, XLON/LSE-SETS, 637] -09:22:49.970 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.N, vpSize 70304, data [AAZ.N, AAZ.N Corporation, GBX, XNGS/NAS-GSM, 44] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.OQ, vpSize 70304, data [AAZ.OQ, AAZ.OQ Co., USD, XNYS/NYS-MAIN, 647] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.AS, vpSize 70304, data [AAZ.AS, AAZ.AS B.V, USD, XAMS/ENA-MAIN, 312] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.L, vpSize 70304, data [ABA.L, ABA.L London PLC, GBX, XLON/LSE-SETS, 914] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.N, vpSize 70304, data [ABA.N, ABA.N Corporation, CAD, XNGS/NAS-GSM, 568] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.OQ, vpSize 70304, data [ABA.OQ, ABA.OQ Co., EUR, XNYS/NYS-MAIN, 66] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.AS, vpSize 70304, data [ABA.AS, ABA.AS B.V, CAD, XAMS/ENA-MAIN, 325] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.L, vpSize 70304, data [ABB.L, ABB.L London PLC, EUR, XLON/LSE-SETS, 322] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.N, vpSize 70304, data [ABB.N, ABB.N Corporation, USD, XNGS/NAS-GSM, 126] -09:22:49.971 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.OQ, vpSize 70304, data [ABB.OQ, ABB.OQ Co., GBX, XNYS/NYS-MAIN, 351] -09:22:50.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 23 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:50.031 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.AS, vpSize 70304, data [ABB.AS, ABB.AS B.V, CAD, XAMS/ENA-MAIN, 524] -09:22:50.031 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.L, vpSize 70304, data [ABC.L, ABC.L London PLC, EUR, XLON/LSE-SETS, 686] -09:22:50.032 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.N, vpSize 70304, data [ABC.N, ABC.N Corporation, CAD, XNGS/NAS-GSM, 751] -09:22:50.032 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.OQ, vpSize 70304, data [ABC.OQ, ABC.OQ Co., CAD, XNYS/NYS-MAIN, 283] -09:22:50.032 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.AS, vpSize 70304, data [ABC.AS, ABC.AS B.V, CAD, XAMS/ENA-MAIN, 888] -09:22:50.032 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.L, vpSize 70304, data [ABD.L, ABD.L London PLC, EUR, XLON/LSE-SETS, 895] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.N, vpSize 70304, data [ABD.N, ABD.N Corporation, USD, XNGS/NAS-GSM, 107] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.OQ, vpSize 70304, data [ABD.OQ, ABD.OQ Co., GBX, XNYS/NYS-MAIN, 269] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.AS, vpSize 70304, data [ABD.AS, ABD.AS B.V, GBX, XAMS/ENA-MAIN, 308] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.L, vpSize 70304, data [ABE.L, ABE.L London PLC, EUR, XLON/LSE-SETS, 137] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.N, vpSize 70304, data [ABE.N, ABE.N Corporation, GBX, XNGS/NAS-GSM, 730] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.OQ, vpSize 70304, data [ABE.OQ, ABE.OQ Co., USD, XNYS/NYS-MAIN, 509] -09:22:50.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.AS, vpSize 70304, data [ABE.AS, ABE.AS B.V, USD, XAMS/ENA-MAIN, 852] -09:22:50.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.L, vpSize 70304, data [ABF.L, ABF.L London PLC, EUR, XLON/LSE-SETS, 50] -09:22:50.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.N, vpSize 70304, data [ABF.N, ABF.N Corporation, CAD, XNGS/NAS-GSM, 943] -09:22:50.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.OQ, vpSize 70304, data [ABF.OQ, ABF.OQ Co., GBX, XNYS/NYS-MAIN, 95] -09:22:50.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.AS, vpSize 70304, data [ABF.AS, ABF.AS B.V, GBX, XAMS/ENA-MAIN, 937] -09:22:50.036 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.L, vpSize 70304, data [ABG.L, ABG.L London PLC, USD, XLON/LSE-SETS, 377] -09:22:50.036 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.N, vpSize 70304, data [ABG.N, ABG.N Corporation, GBX, XNGS/NAS-GSM, 917] -09:22:50.037 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.OQ, vpSize 70304, data [ABG.OQ, ABG.OQ Co., EUR, XNYS/NYS-MAIN, 703] -09:22:50.038 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.AS, vpSize 70304, data [ABG.AS, ABG.AS B.V, CAD, XAMS/ENA-MAIN, 243] -09:22:50.038 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.L, vpSize 70304, data [ABH.L, ABH.L London PLC, USD, XLON/LSE-SETS, 785] -09:22:50.038 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.N, vpSize 70304, data [ABH.N, ABH.N Corporation, USD, XNGS/NAS-GSM, 443] -09:22:50.243 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 0 to 141 -09:22:50.327 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 0->141 -09:22:50.404 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 141 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.L, vpSize 70304, data [AAA.L, AAA.L London PLC, USD, XLON/LSE-SETS, 633] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.N, vpSize 70304, data [AAA.N, AAA.N Corporation, EUR, XNGS/NAS-GSM, 220] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.OQ, vpSize 70304, data [AAA.OQ, AAA.OQ Co., EUR, XNYS/NYS-MAIN, 393] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAA.AS, vpSize 70304, data [AAA.AS, AAA.AS B.V, GBX, XAMS/ENA-MAIN, 449] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.L, vpSize 70304, data [AAB.L, AAB.L London PLC, GBX, XLON/LSE-SETS, 37] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.N, vpSize 70304, data [AAB.N, AAB.N Corporation, CAD, XNGS/NAS-GSM, 38] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.OQ, vpSize 70304, data [AAB.OQ, AAB.OQ Co., GBX, XNYS/NYS-MAIN, 286] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAB.AS, vpSize 70304, data [AAB.AS, AAB.AS B.V, USD, XAMS/ENA-MAIN, 364] -09:22:50.405 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.L, vpSize 70304, data [AAC.L, AAC.L London PLC, EUR, XLON/LSE-SETS, 12] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.N, vpSize 70304, data [AAC.N, AAC.N Corporation, CAD, XNGS/NAS-GSM, 927] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.OQ, vpSize 70304, data [AAC.OQ, AAC.OQ Co., GBX, XNYS/NYS-MAIN, 559] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAC.AS, vpSize 70304, data [AAC.AS, AAC.AS B.V, CAD, XAMS/ENA-MAIN, 946] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.L, vpSize 70304, data [AAD.L, AAD.L London PLC, CAD, XLON/LSE-SETS, 363] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.N, vpSize 70304, data [AAD.N, AAD.N Corporation, CAD, XNGS/NAS-GSM, 696] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.OQ, vpSize 70304, data [AAD.OQ, AAD.OQ Co., EUR, XNYS/NYS-MAIN, 806] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAD.AS, vpSize 70304, data [AAD.AS, AAD.AS B.V, GBX, XAMS/ENA-MAIN, 44] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.L, vpSize 70304, data [AAE.L, AAE.L London PLC, GBX, XLON/LSE-SETS, 226] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.N, vpSize 70304, data [AAE.N, AAE.N Corporation, GBX, XNGS/NAS-GSM, 54] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.OQ, vpSize 70304, data [AAE.OQ, AAE.OQ Co., USD, XNYS/NYS-MAIN, 618] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAE.AS, vpSize 70304, data [AAE.AS, AAE.AS B.V, CAD, XAMS/ENA-MAIN, 643] -09:22:50.406 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.L, vpSize 70304, data [AAF.L, AAF.L London PLC, GBX, XLON/LSE-SETS, 690] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.N, vpSize 70304, data [AAF.N, AAF.N Corporation, CAD, XNGS/NAS-GSM, 623] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.OQ, vpSize 70304, data [AAF.OQ, AAF.OQ Co., USD, XNYS/NYS-MAIN, 167] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAF.AS, vpSize 70304, data [AAF.AS, AAF.AS B.V, EUR, XAMS/ENA-MAIN, 410] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.L, vpSize 70304, data [AAG.L, AAG.L London PLC, EUR, XLON/LSE-SETS, 928] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.N, vpSize 70304, data [AAG.N, AAG.N Corporation, GBX, XNGS/NAS-GSM, 900] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.OQ, vpSize 70304, data [AAG.OQ, AAG.OQ Co., CAD, XNYS/NYS-MAIN, 896] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAG.AS, vpSize 70304, data [AAG.AS, AAG.AS B.V, USD, XAMS/ENA-MAIN, 934] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.L, vpSize 70304, data [AAH.L, AAH.L London PLC, USD, XLON/LSE-SETS, 553] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.N, vpSize 70304, data [AAH.N, AAH.N Corporation, EUR, XNGS/NAS-GSM, 879] -09:22:50.407 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.OQ, vpSize 70304, data [AAH.OQ, AAH.OQ Co., GBX, XNYS/NYS-MAIN, 943] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAH.AS, vpSize 70304, data [AAH.AS, AAH.AS B.V, GBX, XAMS/ENA-MAIN, 303] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.L, vpSize 70304, data [AAI.L, AAI.L London PLC, CAD, XLON/LSE-SETS, 430] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.N, vpSize 70304, data [AAI.N, AAI.N Corporation, EUR, XNGS/NAS-GSM, 628] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.OQ, vpSize 70304, data [AAI.OQ, AAI.OQ Co., CAD, XNYS/NYS-MAIN, 720] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAI.AS, vpSize 70304, data [AAI.AS, AAI.AS B.V, EUR, XAMS/ENA-MAIN, 478] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.L, vpSize 70304, data [AAJ.L, AAJ.L London PLC, CAD, XLON/LSE-SETS, 759] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.N, vpSize 70304, data [AAJ.N, AAJ.N Corporation, GBX, XNGS/NAS-GSM, 697] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.OQ, vpSize 70304, data [AAJ.OQ, AAJ.OQ Co., EUR, XNYS/NYS-MAIN, 68] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAJ.AS, vpSize 70304, data [AAJ.AS, AAJ.AS B.V, GBX, XAMS/ENA-MAIN, 199] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.L, vpSize 70304, data [AAK.L, AAK.L London PLC, USD, XLON/LSE-SETS, 873] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.N, vpSize 70304, data [AAK.N, AAK.N Corporation, EUR, XNGS/NAS-GSM, 951] -09:22:50.408 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.OQ, vpSize 70304, data [AAK.OQ, AAK.OQ Co., EUR, XNYS/NYS-MAIN, 793] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAK.AS, vpSize 70304, data [AAK.AS, AAK.AS B.V, USD, XAMS/ENA-MAIN, 382] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.L, vpSize 70304, data [AAL.L, AAL.L London PLC, GBX, XLON/LSE-SETS, 578] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.N, vpSize 70304, data [AAL.N, AAL.N Corporation, CAD, XNGS/NAS-GSM, 328] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.OQ, vpSize 70304, data [AAL.OQ, AAL.OQ Co., EUR, XNYS/NYS-MAIN, 76] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAL.AS, vpSize 70304, data [AAL.AS, AAL.AS B.V, CAD, XAMS/ENA-MAIN, 691] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.L, vpSize 70304, data [AAM.L, AAM.L London PLC, GBX, XLON/LSE-SETS, 161] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.N, vpSize 70304, data [AAM.N, AAM.N Corporation, CAD, XNGS/NAS-GSM, 57] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.OQ, vpSize 70304, data [AAM.OQ, AAM.OQ Co., CAD, XNYS/NYS-MAIN, 201] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAM.AS, vpSize 70304, data [AAM.AS, AAM.AS B.V, USD, XAMS/ENA-MAIN, 432] -09:22:50.409 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.L, vpSize 70304, data [AAN.L, AAN.L London PLC, USD, XLON/LSE-SETS, 80] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.N, vpSize 70304, data [AAN.N, AAN.N Corporation, CAD, XNGS/NAS-GSM, 903] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.OQ, vpSize 70304, data [AAN.OQ, AAN.OQ Co., EUR, XNYS/NYS-MAIN, 206] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAN.AS, vpSize 70304, data [AAN.AS, AAN.AS B.V, USD, XAMS/ENA-MAIN, 911] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.L, vpSize 70304, data [AAO.L, AAO.L London PLC, CAD, XLON/LSE-SETS, 356] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.N, vpSize 70304, data [AAO.N, AAO.N Corporation, EUR, XNGS/NAS-GSM, 211] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.OQ, vpSize 70304, data [AAO.OQ, AAO.OQ Co., CAD, XNYS/NYS-MAIN, 310] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAO.AS, vpSize 70304, data [AAO.AS, AAO.AS B.V, USD, XAMS/ENA-MAIN, 654] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.L, vpSize 70304, data [AAP.L, AAP.L London PLC, USD, XLON/LSE-SETS, 169] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.N, vpSize 70304, data [AAP.N, AAP.N Corporation, USD, XNGS/NAS-GSM, 408] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.OQ, vpSize 70304, data [AAP.OQ, AAP.OQ Co., GBX, XNYS/NYS-MAIN, 706] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAP.AS, vpSize 70304, data [AAP.AS, AAP.AS B.V, USD, XAMS/ENA-MAIN, 892] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.L, vpSize 70304, data [AAQ.L, AAQ.L London PLC, EUR, XLON/LSE-SETS, 568] -09:22:50.410 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.N, vpSize 70304, data [AAQ.N, AAQ.N Corporation, EUR, XNGS/NAS-GSM, 313] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.OQ, vpSize 70304, data [AAQ.OQ, AAQ.OQ Co., USD, XNYS/NYS-MAIN, 607] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAQ.AS, vpSize 70304, data [AAQ.AS, AAQ.AS B.V, CAD, XAMS/ENA-MAIN, 451] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.L, vpSize 70304, data [AAR.L, AAR.L London PLC, GBX, XLON/LSE-SETS, 346] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.N, vpSize 70304, data [AAR.N, AAR.N Corporation, GBX, XNGS/NAS-GSM, 717] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.OQ, vpSize 70304, data [AAR.OQ, AAR.OQ Co., CAD, XNYS/NYS-MAIN, 404] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAR.AS, vpSize 70304, data [AAR.AS, AAR.AS B.V, GBX, XAMS/ENA-MAIN, 606] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.L, vpSize 70304, data [AAS.L, AAS.L London PLC, USD, XLON/LSE-SETS, 19] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.N, vpSize 70304, data [AAS.N, AAS.N Corporation, GBX, XNGS/NAS-GSM, 429] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.OQ, vpSize 70304, data [AAS.OQ, AAS.OQ Co., EUR, XNYS/NYS-MAIN, 170] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAS.AS, vpSize 70304, data [AAS.AS, AAS.AS B.V, GBX, XAMS/ENA-MAIN, 234] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.L, vpSize 70304, data [AAT.L, AAT.L London PLC, CAD, XLON/LSE-SETS, 202] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.N, vpSize 70304, data [AAT.N, AAT.N Corporation, USD, XNGS/NAS-GSM, 426] -09:22:50.411 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.OQ, vpSize 70304, data [AAT.OQ, AAT.OQ Co., EUR, XNYS/NYS-MAIN, 444] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAT.AS, vpSize 70304, data [AAT.AS, AAT.AS B.V, CAD, XAMS/ENA-MAIN, 134] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.L, vpSize 70304, data [AAU.L, AAU.L London PLC, GBX, XLON/LSE-SETS, 517] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.N, vpSize 70304, data [AAU.N, AAU.N Corporation, GBX, XNGS/NAS-GSM, 169] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.OQ, vpSize 70304, data [AAU.OQ, AAU.OQ Co., EUR, XNYS/NYS-MAIN, 750] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAU.AS, vpSize 70304, data [AAU.AS, AAU.AS B.V, USD, XAMS/ENA-MAIN, 676] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.L, vpSize 70304, data [AAV.L, AAV.L London PLC, CAD, XLON/LSE-SETS, 823] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.N, vpSize 70304, data [AAV.N, AAV.N Corporation, EUR, XNGS/NAS-GSM, 768] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.OQ, vpSize 70304, data [AAV.OQ, AAV.OQ Co., EUR, XNYS/NYS-MAIN, 856] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAV.AS, vpSize 70304, data [AAV.AS, AAV.AS B.V, GBX, XAMS/ENA-MAIN, 120] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.L, vpSize 70304, data [AAW.L, AAW.L London PLC, USD, XLON/LSE-SETS, 900] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.N, vpSize 70304, data [AAW.N, AAW.N Corporation, CAD, XNGS/NAS-GSM, 48] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.OQ, vpSize 70304, data [AAW.OQ, AAW.OQ Co., USD, XNYS/NYS-MAIN, 818] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAW.AS, vpSize 70304, data [AAW.AS, AAW.AS B.V, USD, XAMS/ENA-MAIN, 581] -09:22:50.412 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.L, vpSize 70304, data [AAX.L, AAX.L London PLC, GBX, XLON/LSE-SETS, 761] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.N, vpSize 70304, data [AAX.N, AAX.N Corporation, CAD, XNGS/NAS-GSM, 435] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.OQ, vpSize 70304, data [AAX.OQ, AAX.OQ Co., EUR, XNYS/NYS-MAIN, 407] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAX.AS, vpSize 70304, data [AAX.AS, AAX.AS B.V, GBX, XAMS/ENA-MAIN, 269] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.L, vpSize 70304, data [AAY.L, AAY.L London PLC, EUR, XLON/LSE-SETS, 774] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.N, vpSize 70304, data [AAY.N, AAY.N Corporation, USD, XNGS/NAS-GSM, 44] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.OQ, vpSize 70304, data [AAY.OQ, AAY.OQ Co., EUR, XNYS/NYS-MAIN, 828] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAY.AS, vpSize 70304, data [AAY.AS, AAY.AS B.V, EUR, XAMS/ENA-MAIN, 767] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.L, vpSize 70304, data [AAZ.L, AAZ.L London PLC, EUR, XLON/LSE-SETS, 637] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.N, vpSize 70304, data [AAZ.N, AAZ.N Corporation, GBX, XNGS/NAS-GSM, 44] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.OQ, vpSize 70304, data [AAZ.OQ, AAZ.OQ Co., USD, XNYS/NYS-MAIN, 647] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AAZ.AS, vpSize 70304, data [AAZ.AS, AAZ.AS B.V, USD, XAMS/ENA-MAIN, 312] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.L, vpSize 70304, data [ABA.L, ABA.L London PLC, GBX, XLON/LSE-SETS, 914] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.N, vpSize 70304, data [ABA.N, ABA.N Corporation, CAD, XNGS/NAS-GSM, 568] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.OQ, vpSize 70304, data [ABA.OQ, ABA.OQ Co., EUR, XNYS/NYS-MAIN, 66] -09:22:50.413 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABA.AS, vpSize 70304, data [ABA.AS, ABA.AS B.V, CAD, XAMS/ENA-MAIN, 325] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.L, vpSize 70304, data [ABB.L, ABB.L London PLC, EUR, XLON/LSE-SETS, 322] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.N, vpSize 70304, data [ABB.N, ABB.N Corporation, USD, XNGS/NAS-GSM, 126] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.OQ, vpSize 70304, data [ABB.OQ, ABB.OQ Co., GBX, XNYS/NYS-MAIN, 351] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABB.AS, vpSize 70304, data [ABB.AS, ABB.AS B.V, CAD, XAMS/ENA-MAIN, 524] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.L, vpSize 70304, data [ABC.L, ABC.L London PLC, EUR, XLON/LSE-SETS, 686] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.N, vpSize 70304, data [ABC.N, ABC.N Corporation, CAD, XNGS/NAS-GSM, 751] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.OQ, vpSize 70304, data [ABC.OQ, ABC.OQ Co., CAD, XNYS/NYS-MAIN, 283] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABC.AS, vpSize 70304, data [ABC.AS, ABC.AS B.V, CAD, XAMS/ENA-MAIN, 888] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.L, vpSize 70304, data [ABD.L, ABD.L London PLC, EUR, XLON/LSE-SETS, 895] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.N, vpSize 70304, data [ABD.N, ABD.N Corporation, USD, XNGS/NAS-GSM, 107] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.OQ, vpSize 70304, data [ABD.OQ, ABD.OQ Co., GBX, XNYS/NYS-MAIN, 269] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABD.AS, vpSize 70304, data [ABD.AS, ABD.AS B.V, GBX, XAMS/ENA-MAIN, 308] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.L, vpSize 70304, data [ABE.L, ABE.L London PLC, EUR, XLON/LSE-SETS, 137] -09:22:50.414 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.N, vpSize 70304, data [ABE.N, ABE.N Corporation, GBX, XNGS/NAS-GSM, 730] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.OQ, vpSize 70304, data [ABE.OQ, ABE.OQ Co., USD, XNYS/NYS-MAIN, 509] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABE.AS, vpSize 70304, data [ABE.AS, ABE.AS B.V, USD, XAMS/ENA-MAIN, 852] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.L, vpSize 70304, data [ABF.L, ABF.L London PLC, EUR, XLON/LSE-SETS, 50] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.N, vpSize 70304, data [ABF.N, ABF.N Corporation, CAD, XNGS/NAS-GSM, 943] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.OQ, vpSize 70304, data [ABF.OQ, ABF.OQ Co., GBX, XNYS/NYS-MAIN, 95] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABF.AS, vpSize 70304, data [ABF.AS, ABF.AS B.V, GBX, XAMS/ENA-MAIN, 937] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.L, vpSize 70304, data [ABG.L, ABG.L London PLC, USD, XLON/LSE-SETS, 377] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.N, vpSize 70304, data [ABG.N, ABG.N Corporation, GBX, XNGS/NAS-GSM, 917] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.OQ, vpSize 70304, data [ABG.OQ, ABG.OQ Co., EUR, XNYS/NYS-MAIN, 703] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABG.AS, vpSize 70304, data [ABG.AS, ABG.AS B.V, CAD, XAMS/ENA-MAIN, 243] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.L, vpSize 70304, data [ABH.L, ABH.L London PLC, USD, XLON/LSE-SETS, 785] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.N, vpSize 70304, data [ABH.N, ABH.N Corporation, USD, XNGS/NAS-GSM, 443] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.OQ, vpSize 70304, data [ABH.OQ, ABH.OQ Co., USD, XNYS/NYS-MAIN, 693] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.AS, vpSize 70304, data [ABH.AS, ABH.AS B.V, GBX, XAMS/ENA-MAIN, 102] -09:22:50.415 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.L, vpSize 70304, data [ABI.L, ABI.L London PLC, EUR, XLON/LSE-SETS, 965] -09:22:50.416 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.N, vpSize 70304, data [ABI.N, ABI.N Corporation, EUR, XNGS/NAS-GSM, 34] -09:22:50.416 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.OQ, vpSize 70304, data [ABI.OQ, ABI.OQ Co., USD, XNYS/NYS-MAIN, 184] -09:22:50.416 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.AS, vpSize 70304, data [ABI.AS, ABI.AS B.V, EUR, XAMS/ENA-MAIN, 296] -09:22:50.416 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABJ.L, vpSize 70304, data [ABJ.L, ABJ.L London PLC, GBX, XLON/LSE-SETS, 435] -09:22:50.511 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 7 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:50.513 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.OQ, vpSize 70304, data [ABH.OQ, ABH.OQ Co., USD, XNYS/NYS-MAIN, 693] -09:22:50.513 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABH.AS, vpSize 70304, data [ABH.AS, ABH.AS B.V, GBX, XAMS/ENA-MAIN, 102] -09:22:50.514 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.L, vpSize 70304, data [ABI.L, ABI.L London PLC, EUR, XLON/LSE-SETS, 965] -09:22:50.515 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.N, vpSize 70304, data [ABI.N, ABI.N Corporation, EUR, XNGS/NAS-GSM, 34] -09:22:50.516 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.OQ, vpSize 70304, data [ABI.OQ, ABI.OQ Co., USD, XNYS/NYS-MAIN, 184] -09:22:50.517 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABI.AS, vpSize 70304, data [ABI.AS, ABI.AS B.V, EUR, XAMS/ENA-MAIN, 296] -09:22:50.518 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ABJ.L, vpSize 70304, data [ABJ.L, ABJ.L London PLC, GBX, XLON/LSE-SETS, 435] -09:22:53.889 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 1684 to 1884 -09:22:53.945 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 1684->1884 -09:22:54.013 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 200 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:54.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQF.L, vpSize 70304, data [AQF.L, AQF.L London PLC, EUR, XLON/LSE-SETS, 789] -09:22:54.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQF.N, vpSize 70304, data [AQF.N, AQF.N Corporation, EUR, XNGS/NAS-GSM, 503] -09:22:54.014 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQF.OQ, vpSize 70304, data [AQF.OQ, AQF.OQ Co., GBX, XNYS/NYS-MAIN, 115] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQF.AS, vpSize 70304, data [AQF.AS, AQF.AS B.V, CAD, XAMS/ENA-MAIN, 455] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQG.L, vpSize 70304, data [AQG.L, AQG.L London PLC, CAD, XLON/LSE-SETS, 528] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQG.N, vpSize 70304, data [AQG.N, AQG.N Corporation, GBX, XNGS/NAS-GSM, 479] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQG.OQ, vpSize 70304, data [AQG.OQ, AQG.OQ Co., USD, XNYS/NYS-MAIN, 978] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQG.AS, vpSize 70304, data [AQG.AS, AQG.AS B.V, CAD, XAMS/ENA-MAIN, 944] -09:22:54.015 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQH.L, vpSize 70304, data [AQH.L, AQH.L London PLC, EUR, XLON/LSE-SETS, 457] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQH.N, vpSize 70304, data [AQH.N, AQH.N Corporation, EUR, XNGS/NAS-GSM, 655] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQH.OQ, vpSize 70304, data [AQH.OQ, AQH.OQ Co., GBX, XNYS/NYS-MAIN, 121] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQH.AS, vpSize 70304, data [AQH.AS, AQH.AS B.V, EUR, XAMS/ENA-MAIN, 759] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQI.L, vpSize 70304, data [AQI.L, AQI.L London PLC, CAD, XLON/LSE-SETS, 542] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQI.N, vpSize 70304, data [AQI.N, AQI.N Corporation, GBX, XNGS/NAS-GSM, 948] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQI.OQ, vpSize 70304, data [AQI.OQ, AQI.OQ Co., USD, XNYS/NYS-MAIN, 492] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQI.AS, vpSize 70304, data [AQI.AS, AQI.AS B.V, EUR, XAMS/ENA-MAIN, 839] -09:22:54.016 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQJ.L, vpSize 70304, data [AQJ.L, AQJ.L London PLC, CAD, XLON/LSE-SETS, 603] -09:22:54.017 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQJ.N, vpSize 70304, data [AQJ.N, AQJ.N Corporation, CAD, XNGS/NAS-GSM, 627] -09:22:54.017 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQJ.OQ, vpSize 70304, data [AQJ.OQ, AQJ.OQ Co., EUR, XNYS/NYS-MAIN, 683] -09:22:54.017 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQJ.AS, vpSize 70304, data [AQJ.AS, AQJ.AS B.V, CAD, XAMS/ENA-MAIN, 34] -09:22:54.017 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQK.L, vpSize 70304, data [AQK.L, AQK.L London PLC, USD, XLON/LSE-SETS, 874] -09:22:54.018 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQK.N, vpSize 70304, data [AQK.N, AQK.N Corporation, USD, XNGS/NAS-GSM, 316] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQK.OQ, vpSize 70304, data [AQK.OQ, AQK.OQ Co., GBX, XNYS/NYS-MAIN, 239] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQK.AS, vpSize 70304, data [AQK.AS, AQK.AS B.V, USD, XAMS/ENA-MAIN, 414] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQL.L, vpSize 70304, data [AQL.L, AQL.L London PLC, GBX, XLON/LSE-SETS, 10] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQL.N, vpSize 70304, data [AQL.N, AQL.N Corporation, CAD, XNGS/NAS-GSM, 51] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQL.OQ, vpSize 70304, data [AQL.OQ, AQL.OQ Co., CAD, XNYS/NYS-MAIN, 746] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQL.AS, vpSize 70304, data [AQL.AS, AQL.AS B.V, CAD, XAMS/ENA-MAIN, 890] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQM.L, vpSize 70304, data [AQM.L, AQM.L London PLC, GBX, XLON/LSE-SETS, 226] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQM.N, vpSize 70304, data [AQM.N, AQM.N Corporation, CAD, XNGS/NAS-GSM, 707] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQM.OQ, vpSize 70304, data [AQM.OQ, AQM.OQ Co., GBX, XNYS/NYS-MAIN, 49] -09:22:54.019 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQM.AS, vpSize 70304, data [AQM.AS, AQM.AS B.V, GBX, XAMS/ENA-MAIN, 919] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQN.L, vpSize 70304, data [AQN.L, AQN.L London PLC, EUR, XLON/LSE-SETS, 844] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQN.N, vpSize 70304, data [AQN.N, AQN.N Corporation, GBX, XNGS/NAS-GSM, 851] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQN.OQ, vpSize 70304, data [AQN.OQ, AQN.OQ Co., EUR, XNYS/NYS-MAIN, 875] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQN.AS, vpSize 70304, data [AQN.AS, AQN.AS B.V, EUR, XAMS/ENA-MAIN, 504] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQO.L, vpSize 70304, data [AQO.L, AQO.L London PLC, USD, XLON/LSE-SETS, 397] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQO.N, vpSize 70304, data [AQO.N, AQO.N Corporation, EUR, XNGS/NAS-GSM, 907] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQO.OQ, vpSize 70304, data [AQO.OQ, AQO.OQ Co., USD, XNYS/NYS-MAIN, 552] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQO.AS, vpSize 70304, data [AQO.AS, AQO.AS B.V, EUR, XAMS/ENA-MAIN, 172] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQP.L, vpSize 70304, data [AQP.L, AQP.L London PLC, USD, XLON/LSE-SETS, 513] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQP.N, vpSize 70304, data [AQP.N, AQP.N Corporation, USD, XNGS/NAS-GSM, 965] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQP.OQ, vpSize 70304, data [AQP.OQ, AQP.OQ Co., CAD, XNYS/NYS-MAIN, 276] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQP.AS, vpSize 70304, data [AQP.AS, AQP.AS B.V, GBX, XAMS/ENA-MAIN, 545] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQQ.L, vpSize 70304, data [AQQ.L, AQQ.L London PLC, USD, XLON/LSE-SETS, 833] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQQ.N, vpSize 70304, data [AQQ.N, AQQ.N Corporation, GBX, XNGS/NAS-GSM, 238] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQQ.OQ, vpSize 70304, data [AQQ.OQ, AQQ.OQ Co., USD, XNYS/NYS-MAIN, 323] -09:22:54.020 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQQ.AS, vpSize 70304, data [AQQ.AS, AQQ.AS B.V, USD, XAMS/ENA-MAIN, 640] -09:22:54.022 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQR.L, vpSize 70304, data [AQR.L, AQR.L London PLC, USD, XLON/LSE-SETS, 526] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQR.N, vpSize 70304, data [AQR.N, AQR.N Corporation, GBX, XNGS/NAS-GSM, 748] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQR.OQ, vpSize 70304, data [AQR.OQ, AQR.OQ Co., GBX, XNYS/NYS-MAIN, 380] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQR.AS, vpSize 70304, data [AQR.AS, AQR.AS B.V, USD, XAMS/ENA-MAIN, 477] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQS.L, vpSize 70304, data [AQS.L, AQS.L London PLC, GBX, XLON/LSE-SETS, 612] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQS.N, vpSize 70304, data [AQS.N, AQS.N Corporation, CAD, XNGS/NAS-GSM, 863] -09:22:54.023 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQS.OQ, vpSize 70304, data [AQS.OQ, AQS.OQ Co., GBX, XNYS/NYS-MAIN, 321] -09:22:54.029 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQS.AS, vpSize 70304, data [AQS.AS, AQS.AS B.V, GBX, XAMS/ENA-MAIN, 686] -09:22:54.029 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQT.L, vpSize 70304, data [AQT.L, AQT.L London PLC, CAD, XLON/LSE-SETS, 434] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQT.N, vpSize 70304, data [AQT.N, AQT.N Corporation, GBX, XNGS/NAS-GSM, 713] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQT.OQ, vpSize 70304, data [AQT.OQ, AQT.OQ Co., CAD, XNYS/NYS-MAIN, 498] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQT.AS, vpSize 70304, data [AQT.AS, AQT.AS B.V, GBX, XAMS/ENA-MAIN, 345] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQU.L, vpSize 70304, data [AQU.L, AQU.L London PLC, GBX, XLON/LSE-SETS, 798] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQU.N, vpSize 70304, data [AQU.N, AQU.N Corporation, GBX, XNGS/NAS-GSM, 160] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQU.OQ, vpSize 70304, data [AQU.OQ, AQU.OQ Co., CAD, XNYS/NYS-MAIN, 319] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQU.AS, vpSize 70304, data [AQU.AS, AQU.AS B.V, USD, XAMS/ENA-MAIN, 408] -09:22:54.030 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQV.L, vpSize 70304, data [AQV.L, AQV.L London PLC, USD, XLON/LSE-SETS, 84] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQV.N, vpSize 70304, data [AQV.N, AQV.N Corporation, GBX, XNGS/NAS-GSM, 929] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQV.OQ, vpSize 70304, data [AQV.OQ, AQV.OQ Co., EUR, XNYS/NYS-MAIN, 397] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQV.AS, vpSize 70304, data [AQV.AS, AQV.AS B.V, USD, XAMS/ENA-MAIN, 301] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQW.L, vpSize 70304, data [AQW.L, AQW.L London PLC, USD, XLON/LSE-SETS, 797] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQW.N, vpSize 70304, data [AQW.N, AQW.N Corporation, USD, XNGS/NAS-GSM, 900] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQW.OQ, vpSize 70304, data [AQW.OQ, AQW.OQ Co., CAD, XNYS/NYS-MAIN, 957] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQW.AS, vpSize 70304, data [AQW.AS, AQW.AS B.V, EUR, XAMS/ENA-MAIN, 744] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQX.L, vpSize 70304, data [AQX.L, AQX.L London PLC, CAD, XLON/LSE-SETS, 433] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQX.N, vpSize 70304, data [AQX.N, AQX.N Corporation, EUR, XNGS/NAS-GSM, 900] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQX.OQ, vpSize 70304, data [AQX.OQ, AQX.OQ Co., USD, XNYS/NYS-MAIN, 586] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQX.AS, vpSize 70304, data [AQX.AS, AQX.AS B.V, USD, XAMS/ENA-MAIN, 526] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQY.L, vpSize 70304, data [AQY.L, AQY.L London PLC, USD, XLON/LSE-SETS, 79] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQY.N, vpSize 70304, data [AQY.N, AQY.N Corporation, EUR, XNGS/NAS-GSM, 149] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQY.OQ, vpSize 70304, data [AQY.OQ, AQY.OQ Co., CAD, XNYS/NYS-MAIN, 289] -09:22:54.033 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQY.AS, vpSize 70304, data [AQY.AS, AQY.AS B.V, USD, XAMS/ENA-MAIN, 289] -09:22:54.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQZ.L, vpSize 70304, data [AQZ.L, AQZ.L London PLC, USD, XLON/LSE-SETS, 226] -09:22:54.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQZ.N, vpSize 70304, data [AQZ.N, AQZ.N Corporation, CAD, XNGS/NAS-GSM, 326] -09:22:54.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQZ.OQ, vpSize 70304, data [AQZ.OQ, AQZ.OQ Co., EUR, XNYS/NYS-MAIN, 528] -09:22:54.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AQZ.AS, vpSize 70304, data [AQZ.AS, AQZ.AS B.V, GBX, XAMS/ENA-MAIN, 668] -09:22:54.034 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARA.L, vpSize 70304, data [ARA.L, ARA.L London PLC, EUR, XLON/LSE-SETS, 171] -09:22:54.035 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARA.N, vpSize 70304, data [ARA.N, ARA.N Corporation, GBX, XNGS/NAS-GSM, 31] -09:22:54.037 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARA.OQ, vpSize 70304, data [ARA.OQ, ARA.OQ Co., USD, XNYS/NYS-MAIN, 385] -09:22:54.041 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARA.AS, vpSize 70304, data [ARA.AS, ARA.AS B.V, USD, XAMS/ENA-MAIN, 246] -09:22:54.043 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARB.L, vpSize 70304, data [ARB.L, ARB.L London PLC, GBX, XLON/LSE-SETS, 355] -09:22:54.047 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARB.N, vpSize 70304, data [ARB.N, ARB.N Corporation, EUR, XNGS/NAS-GSM, 497] -09:22:54.048 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARB.OQ, vpSize 70304, data [ARB.OQ, ARB.OQ Co., GBX, XNYS/NYS-MAIN, 566] -09:22:54.049 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARB.AS, vpSize 70304, data [ARB.AS, ARB.AS B.V, EUR, XAMS/ENA-MAIN, 236] -09:22:54.050 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARC.L, vpSize 70304, data [ARC.L, ARC.L London PLC, USD, XLON/LSE-SETS, 296] -09:22:54.050 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARC.N, vpSize 70304, data [ARC.N, ARC.N Corporation, EUR, XNGS/NAS-GSM, 346] -09:22:54.051 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARC.OQ, vpSize 70304, data [ARC.OQ, ARC.OQ Co., CAD, XNYS/NYS-MAIN, 932] -09:22:54.052 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARC.AS, vpSize 70304, data [ARC.AS, ARC.AS B.V, EUR, XAMS/ENA-MAIN, 544] -09:22:54.053 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARD.L, vpSize 70304, data [ARD.L, ARD.L London PLC, CAD, XLON/LSE-SETS, 220] -09:22:54.096 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 2007 to 2148 -09:22:54.133 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARD.N, vpSize 70304, data [ARD.N, ARD.N Corporation, EUR, XNGS/NAS-GSM, 888] -09:22:54.136 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARD.OQ, vpSize 70304, data [ARD.OQ, ARD.OQ Co., GBX, XNYS/NYS-MAIN, 346] -09:22:54.137 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARD.AS, vpSize 70304, data [ARD.AS, ARD.AS B.V, USD, XAMS/ENA-MAIN, 934] -09:22:54.138 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARE.L, vpSize 70304, data [ARE.L, ARE.L London PLC, GBX, XLON/LSE-SETS, 915] -09:22:54.138 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARE.N, vpSize 70304, data [ARE.N, ARE.N Corporation, CAD, XNGS/NAS-GSM, 875] -09:22:54.138 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARE.OQ, vpSize 70304, data [ARE.OQ, ARE.OQ Co., CAD, XNYS/NYS-MAIN, 680] -09:22:54.138 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARE.AS, vpSize 70304, data [ARE.AS, ARE.AS B.V, GBX, XAMS/ENA-MAIN, 747] -09:22:54.138 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARF.L, vpSize 70304, data [ARF.L, ARF.L London PLC, CAD, XLON/LSE-SETS, 851] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARF.N, vpSize 70304, data [ARF.N, ARF.N Corporation, CAD, XNGS/NAS-GSM, 437] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARF.OQ, vpSize 70304, data [ARF.OQ, ARF.OQ Co., CAD, XNYS/NYS-MAIN, 730] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARF.AS, vpSize 70304, data [ARF.AS, ARF.AS B.V, CAD, XAMS/ENA-MAIN, 623] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARG.L, vpSize 70304, data [ARG.L, ARG.L London PLC, USD, XLON/LSE-SETS, 491] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARG.N, vpSize 70304, data [ARG.N, ARG.N Corporation, GBX, XNGS/NAS-GSM, 315] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARG.OQ, vpSize 70304, data [ARG.OQ, ARG.OQ Co., CAD, XNYS/NYS-MAIN, 389] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARG.AS, vpSize 70304, data [ARG.AS, ARG.AS B.V, CAD, XAMS/ENA-MAIN, 929] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARH.L, vpSize 70304, data [ARH.L, ARH.L London PLC, EUR, XLON/LSE-SETS, 614] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARH.N, vpSize 70304, data [ARH.N, ARH.N Corporation, CAD, XNGS/NAS-GSM, 402] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARH.OQ, vpSize 70304, data [ARH.OQ, ARH.OQ Co., GBX, XNYS/NYS-MAIN, 798] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARH.AS, vpSize 70304, data [ARH.AS, ARH.AS B.V, GBX, XAMS/ENA-MAIN, 311] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARI.L, vpSize 70304, data [ARI.L, ARI.L London PLC, USD, XLON/LSE-SETS, 727] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARI.N, vpSize 70304, data [ARI.N, ARI.N Corporation, CAD, XNGS/NAS-GSM, 900] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARI.OQ, vpSize 70304, data [ARI.OQ, ARI.OQ Co., CAD, XNYS/NYS-MAIN, 527] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARI.AS, vpSize 70304, data [ARI.AS, ARI.AS B.V, USD, XAMS/ENA-MAIN, 749] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARJ.L, vpSize 70304, data [ARJ.L, ARJ.L London PLC, EUR, XLON/LSE-SETS, 124] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARJ.N, vpSize 70304, data [ARJ.N, ARJ.N Corporation, EUR, XNGS/NAS-GSM, 651] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARJ.OQ, vpSize 70304, data [ARJ.OQ, ARJ.OQ Co., CAD, XNYS/NYS-MAIN, 28] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARJ.AS, vpSize 70304, data [ARJ.AS, ARJ.AS B.V, USD, XAMS/ENA-MAIN, 186] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARK.L, vpSize 70304, data [ARK.L, ARK.L London PLC, USD, XLON/LSE-SETS, 237] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARK.N, vpSize 70304, data [ARK.N, ARK.N Corporation, GBX, XNGS/NAS-GSM, 434] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARK.OQ, vpSize 70304, data [ARK.OQ, ARK.OQ Co., GBX, XNYS/NYS-MAIN, 327] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARK.AS, vpSize 70304, data [ARK.AS, ARK.AS B.V, USD, XAMS/ENA-MAIN, 840] -09:22:54.139 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARL.L, vpSize 70304, data [ARL.L, ARL.L London PLC, CAD, XLON/LSE-SETS, 748] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARL.N, vpSize 70304, data [ARL.N, ARL.N Corporation, USD, XNGS/NAS-GSM, 737] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARL.OQ, vpSize 70304, data [ARL.OQ, ARL.OQ Co., GBX, XNYS/NYS-MAIN, 457] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARL.AS, vpSize 70304, data [ARL.AS, ARL.AS B.V, EUR, XAMS/ENA-MAIN, 307] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARM.L, vpSize 70304, data [ARM.L, ARM.L London PLC, USD, XLON/LSE-SETS, 573] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARM.N, vpSize 70304, data [ARM.N, ARM.N Corporation, USD, XNGS/NAS-GSM, 655] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARM.OQ, vpSize 70304, data [ARM.OQ, ARM.OQ Co., GBX, XNYS/NYS-MAIN, 386] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARM.AS, vpSize 70304, data [ARM.AS, ARM.AS B.V, EUR, XAMS/ENA-MAIN, 270] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARN.L, vpSize 70304, data [ARN.L, ARN.L London PLC, CAD, XLON/LSE-SETS, 84] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARN.N, vpSize 70304, data [ARN.N, ARN.N Corporation, EUR, XNGS/NAS-GSM, 383] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARN.OQ, vpSize 70304, data [ARN.OQ, ARN.OQ Co., EUR, XNYS/NYS-MAIN, 909] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARN.AS, vpSize 70304, data [ARN.AS, ARN.AS B.V, EUR, XAMS/ENA-MAIN, 867] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARO.L, vpSize 70304, data [ARO.L, ARO.L London PLC, GBX, XLON/LSE-SETS, 243] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARO.N, vpSize 70304, data [ARO.N, ARO.N Corporation, CAD, XNGS/NAS-GSM, 901] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARO.OQ, vpSize 70304, data [ARO.OQ, ARO.OQ Co., USD, XNYS/NYS-MAIN, 119] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARO.AS, vpSize 70304, data [ARO.AS, ARO.AS B.V, USD, XAMS/ENA-MAIN, 713] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARP.L, vpSize 70304, data [ARP.L, ARP.L London PLC, EUR, XLON/LSE-SETS, 179] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARP.N, vpSize 70304, data [ARP.N, ARP.N Corporation, USD, XNGS/NAS-GSM, 912] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARP.OQ, vpSize 70304, data [ARP.OQ, ARP.OQ Co., USD, XNYS/NYS-MAIN, 191] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARP.AS, vpSize 70304, data [ARP.AS, ARP.AS B.V, GBX, XAMS/ENA-MAIN, 741] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARQ.L, vpSize 70304, data [ARQ.L, ARQ.L London PLC, GBX, XLON/LSE-SETS, 671] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARQ.N, vpSize 70304, data [ARQ.N, ARQ.N Corporation, EUR, XNGS/NAS-GSM, 352] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARQ.OQ, vpSize 70304, data [ARQ.OQ, ARQ.OQ Co., CAD, XNYS/NYS-MAIN, 493] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARQ.AS, vpSize 70304, data [ARQ.AS, ARQ.AS B.V, GBX, XAMS/ENA-MAIN, 636] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARR.L, vpSize 70304, data [ARR.L, ARR.L London PLC, GBX, XLON/LSE-SETS, 134] -09:22:54.140 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARR.N, vpSize 70304, data [ARR.N, ARR.N Corporation, EUR, XNGS/NAS-GSM, 62] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARR.OQ, vpSize 70304, data [ARR.OQ, ARR.OQ Co., EUR, XNYS/NYS-MAIN, 940] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARR.AS, vpSize 70304, data [ARR.AS, ARR.AS B.V, EUR, XAMS/ENA-MAIN, 508] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARS.L, vpSize 70304, data [ARS.L, ARS.L London PLC, CAD, XLON/LSE-SETS, 712] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARS.N, vpSize 70304, data [ARS.N, ARS.N Corporation, GBX, XNGS/NAS-GSM, 400] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARS.OQ, vpSize 70304, data [ARS.OQ, ARS.OQ Co., GBX, XNYS/NYS-MAIN, 465] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARS.AS, vpSize 70304, data [ARS.AS, ARS.AS B.V, USD, XAMS/ENA-MAIN, 952] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ART.L, vpSize 70304, data [ART.L, ART.L London PLC, USD, XLON/LSE-SETS, 62] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ART.N, vpSize 70304, data [ART.N, ART.N Corporation, GBX, XNGS/NAS-GSM, 476] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ART.OQ, vpSize 70304, data [ART.OQ, ART.OQ Co., GBX, XNYS/NYS-MAIN, 747] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ART.AS, vpSize 70304, data [ART.AS, ART.AS B.V, EUR, XAMS/ENA-MAIN, 179] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARU.L, vpSize 70304, data [ARU.L, ARU.L London PLC, GBX, XLON/LSE-SETS, 323] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARU.N, vpSize 70304, data [ARU.N, ARU.N Corporation, EUR, XNGS/NAS-GSM, 313] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARU.OQ, vpSize 70304, data [ARU.OQ, ARU.OQ Co., GBX, XNYS/NYS-MAIN, 147] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARU.AS, vpSize 70304, data [ARU.AS, ARU.AS B.V, GBX, XAMS/ENA-MAIN, 433] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARV.L, vpSize 70304, data [ARV.L, ARV.L London PLC, EUR, XLON/LSE-SETS, 671] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARV.N, vpSize 70304, data [ARV.N, ARV.N Corporation, USD, XNGS/NAS-GSM, 923] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARV.OQ, vpSize 70304, data [ARV.OQ, ARV.OQ Co., EUR, XNYS/NYS-MAIN, 507] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARV.AS, vpSize 70304, data [ARV.AS, ARV.AS B.V, EUR, XAMS/ENA-MAIN, 835] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARW.L, vpSize 70304, data [ARW.L, ARW.L London PLC, EUR, XLON/LSE-SETS, 560] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARW.N, vpSize 70304, data [ARW.N, ARW.N Corporation, GBX, XNGS/NAS-GSM, 30] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARW.OQ, vpSize 70304, data [ARW.OQ, ARW.OQ Co., CAD, XNYS/NYS-MAIN, 753] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARW.AS, vpSize 70304, data [ARW.AS, ARW.AS B.V, EUR, XAMS/ENA-MAIN, 241] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARX.L, vpSize 70304, data [ARX.L, ARX.L London PLC, GBX, XLON/LSE-SETS, 744] -09:22:54.141 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARX.N, vpSize 70304, data [ARX.N, ARX.N Corporation, EUR, XNGS/NAS-GSM, 936] -09:22:54.142 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARX.OQ, vpSize 70304, data [ARX.OQ, ARX.OQ Co., EUR, XNYS/NYS-MAIN, 578] -09:22:54.142 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARX.AS, vpSize 70304, data [ARX.AS, ARX.AS B.V, USD, XAMS/ENA-MAIN, 7] -09:22:54.142 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARY.L, vpSize 70304, data [ARY.L, ARY.L London PLC, EUR, XLON/LSE-SETS, 276] -09:22:54.142 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARY.N, vpSize 70304, data [ARY.N, ARY.N Corporation, EUR, XNGS/NAS-GSM, 72] -09:22:54.142 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARY.OQ, vpSize 70304, data [ARY.OQ, ARY.OQ Co., GBX, XNYS/NYS-MAIN, 129] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARY.AS, vpSize 70304, data [ARY.AS, ARY.AS B.V, EUR, XAMS/ENA-MAIN, 442] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARZ.L, vpSize 70304, data [ARZ.L, ARZ.L London PLC, EUR, XLON/LSE-SETS, 569] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARZ.N, vpSize 70304, data [ARZ.N, ARZ.N Corporation, GBX, XNGS/NAS-GSM, 547] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARZ.OQ, vpSize 70304, data [ARZ.OQ, ARZ.OQ Co., EUR, XNYS/NYS-MAIN, 871] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ARZ.AS, vpSize 70304, data [ARZ.AS, ARZ.AS B.V, GBX, XAMS/ENA-MAIN, 266] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASA.L, vpSize 70304, data [ASA.L, ASA.L London PLC, USD, XLON/LSE-SETS, 31] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASA.N, vpSize 70304, data [ASA.N, ASA.N Corporation, CAD, XNGS/NAS-GSM, 371] -09:22:54.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASA.OQ, vpSize 70304, data [ASA.OQ, ASA.OQ Co., GBX, XNYS/NYS-MAIN, 922] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASA.AS, vpSize 70304, data [ASA.AS, ASA.AS B.V, GBX, XAMS/ENA-MAIN, 568] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASB.L, vpSize 70304, data [ASB.L, ASB.L London PLC, EUR, XLON/LSE-SETS, 727] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASB.N, vpSize 70304, data [ASB.N, ASB.N Corporation, CAD, XNGS/NAS-GSM, 680] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASB.OQ, vpSize 70304, data [ASB.OQ, ASB.OQ Co., EUR, XNYS/NYS-MAIN, 632] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASB.AS, vpSize 70304, data [ASB.AS, ASB.AS B.V, EUR, XAMS/ENA-MAIN, 46] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASC.L, vpSize 70304, data [ASC.L, ASC.L London PLC, GBX, XLON/LSE-SETS, 390] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASC.N, vpSize 70304, data [ASC.N, ASC.N Corporation, EUR, XNGS/NAS-GSM, 921] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASC.OQ, vpSize 70304, data [ASC.OQ, ASC.OQ Co., GBX, XNYS/NYS-MAIN, 586] -09:22:54.144 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ASC.AS, vpSize 70304, data [ASC.AS, ASC.AS B.V, USD, XAMS/ENA-MAIN, 35] -09:22:54.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 2007->2148 -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 141 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATH.AS, vpSize 70304, data [ATH.AS, ATH.AS B.V, GBX, XAMS/ENA-MAIN, 161] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.L, vpSize 70304, data [ATI.L, ATI.L London PLC, CAD, XLON/LSE-SETS, 858] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.N, vpSize 70304, data [ATI.N, ATI.N Corporation, CAD, XNGS/NAS-GSM, 944] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.OQ, vpSize 70304, data [ATI.OQ, ATI.OQ Co., USD, XNYS/NYS-MAIN, 114] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.AS, vpSize 70304, data [ATI.AS, ATI.AS B.V, EUR, XAMS/ENA-MAIN, 289] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.L, vpSize 70304, data [ATJ.L, ATJ.L London PLC, CAD, XLON/LSE-SETS, 476] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.N, vpSize 70304, data [ATJ.N, ATJ.N Corporation, CAD, XNGS/NAS-GSM, 616] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.OQ, vpSize 70304, data [ATJ.OQ, ATJ.OQ Co., EUR, XNYS/NYS-MAIN, 8] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.AS, vpSize 70304, data [ATJ.AS, ATJ.AS B.V, EUR, XAMS/ENA-MAIN, 233] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.L, vpSize 70304, data [ATK.L, ATK.L London PLC, USD, XLON/LSE-SETS, 965] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.N, vpSize 70304, data [ATK.N, ATK.N Corporation, EUR, XNGS/NAS-GSM, 725] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.OQ, vpSize 70304, data [ATK.OQ, ATK.OQ Co., EUR, XNYS/NYS-MAIN, 11] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.AS, vpSize 70304, data [ATK.AS, ATK.AS B.V, USD, XAMS/ENA-MAIN, 322] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.L, vpSize 70304, data [ATL.L, ATL.L London PLC, CAD, XLON/LSE-SETS, 294] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.N, vpSize 70304, data [ATL.N, ATL.N Corporation, CAD, XNGS/NAS-GSM, 741] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.OQ, vpSize 70304, data [ATL.OQ, ATL.OQ Co., USD, XNYS/NYS-MAIN, 595] -09:22:54.372 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.AS, vpSize 70304, data [ATL.AS, ATL.AS B.V, EUR, XAMS/ENA-MAIN, 743] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.L, vpSize 70304, data [ATM.L, ATM.L London PLC, GBX, XLON/LSE-SETS, 346] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.N, vpSize 70304, data [ATM.N, ATM.N Corporation, EUR, XNGS/NAS-GSM, 705] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.OQ, vpSize 70304, data [ATM.OQ, ATM.OQ Co., CAD, XNYS/NYS-MAIN, 632] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.AS, vpSize 70304, data [ATM.AS, ATM.AS B.V, GBX, XAMS/ENA-MAIN, 126] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.L, vpSize 70304, data [ATN.L, ATN.L London PLC, EUR, XLON/LSE-SETS, 736] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.N, vpSize 70304, data [ATN.N, ATN.N Corporation, GBX, XNGS/NAS-GSM, 940] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.OQ, vpSize 70304, data [ATN.OQ, ATN.OQ Co., GBX, XNYS/NYS-MAIN, 710] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.AS, vpSize 70304, data [ATN.AS, ATN.AS B.V, GBX, XAMS/ENA-MAIN, 429] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.L, vpSize 70304, data [ATO.L, ATO.L London PLC, EUR, XLON/LSE-SETS, 584] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.N, vpSize 70304, data [ATO.N, ATO.N Corporation, USD, XNGS/NAS-GSM, 200] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.OQ, vpSize 70304, data [ATO.OQ, ATO.OQ Co., CAD, XNYS/NYS-MAIN, 841] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.AS, vpSize 70304, data [ATO.AS, ATO.AS B.V, EUR, XAMS/ENA-MAIN, 583] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.L, vpSize 70304, data [ATP.L, ATP.L London PLC, USD, XLON/LSE-SETS, 450] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.N, vpSize 70304, data [ATP.N, ATP.N Corporation, USD, XNGS/NAS-GSM, 870] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.OQ, vpSize 70304, data [ATP.OQ, ATP.OQ Co., GBX, XNYS/NYS-MAIN, 775] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.AS, vpSize 70304, data [ATP.AS, ATP.AS B.V, EUR, XAMS/ENA-MAIN, 735] -09:22:54.373 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.L, vpSize 70304, data [ATQ.L, ATQ.L London PLC, CAD, XLON/LSE-SETS, 540] -09:22:54.374 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.N, vpSize 70304, data [ATQ.N, ATQ.N Corporation, USD, XNGS/NAS-GSM, 924] -09:22:54.387 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.OQ, vpSize 70304, data [ATQ.OQ, ATQ.OQ Co., USD, XNYS/NYS-MAIN, 58] -09:22:54.387 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.AS, vpSize 70304, data [ATQ.AS, ATQ.AS B.V, CAD, XAMS/ENA-MAIN, 378] -09:22:54.387 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.L, vpSize 70304, data [ATR.L, ATR.L London PLC, EUR, XLON/LSE-SETS, 514] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.N, vpSize 70304, data [ATR.N, ATR.N Corporation, GBX, XNGS/NAS-GSM, 38] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.OQ, vpSize 70304, data [ATR.OQ, ATR.OQ Co., USD, XNYS/NYS-MAIN, 197] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.AS, vpSize 70304, data [ATR.AS, ATR.AS B.V, GBX, XAMS/ENA-MAIN, 591] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.L, vpSize 70304, data [ATS.L, ATS.L London PLC, EUR, XLON/LSE-SETS, 110] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.N, vpSize 70304, data [ATS.N, ATS.N Corporation, USD, XNGS/NAS-GSM, 295] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.OQ, vpSize 70304, data [ATS.OQ, ATS.OQ Co., USD, XNYS/NYS-MAIN, 940] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.AS, vpSize 70304, data [ATS.AS, ATS.AS B.V, CAD, XAMS/ENA-MAIN, 7] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.L, vpSize 70304, data [ATT.L, ATT.L London PLC, USD, XLON/LSE-SETS, 375] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.N, vpSize 70304, data [ATT.N, ATT.N Corporation, USD, XNGS/NAS-GSM, 726] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.OQ, vpSize 70304, data [ATT.OQ, ATT.OQ Co., USD, XNYS/NYS-MAIN, 390] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.AS, vpSize 70304, data [ATT.AS, ATT.AS B.V, GBX, XAMS/ENA-MAIN, 542] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.L, vpSize 70304, data [ATU.L, ATU.L London PLC, EUR, XLON/LSE-SETS, 155] -09:22:54.388 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.N, vpSize 70304, data [ATU.N, ATU.N Corporation, EUR, XNGS/NAS-GSM, 356] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.OQ, vpSize 70304, data [ATU.OQ, ATU.OQ Co., GBX, XNYS/NYS-MAIN, 436] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.AS, vpSize 70304, data [ATU.AS, ATU.AS B.V, CAD, XAMS/ENA-MAIN, 738] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.L, vpSize 70304, data [ATV.L, ATV.L London PLC, EUR, XLON/LSE-SETS, 791] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.N, vpSize 70304, data [ATV.N, ATV.N Corporation, EUR, XNGS/NAS-GSM, 98] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.OQ, vpSize 70304, data [ATV.OQ, ATV.OQ Co., GBX, XNYS/NYS-MAIN, 193] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.AS, vpSize 70304, data [ATV.AS, ATV.AS B.V, EUR, XAMS/ENA-MAIN, 129] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.L, vpSize 70304, data [ATW.L, ATW.L London PLC, CAD, XLON/LSE-SETS, 731] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.N, vpSize 70304, data [ATW.N, ATW.N Corporation, USD, XNGS/NAS-GSM, 205] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.OQ, vpSize 70304, data [ATW.OQ, ATW.OQ Co., EUR, XNYS/NYS-MAIN, 17] -09:22:54.389 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.AS, vpSize 70304, data [ATW.AS, ATW.AS B.V, CAD, XAMS/ENA-MAIN, 157] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.L, vpSize 70304, data [ATX.L, ATX.L London PLC, CAD, XLON/LSE-SETS, 352] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.N, vpSize 70304, data [ATX.N, ATX.N Corporation, EUR, XNGS/NAS-GSM, 964] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.OQ, vpSize 70304, data [ATX.OQ, ATX.OQ Co., USD, XNYS/NYS-MAIN, 668] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.AS, vpSize 70304, data [ATX.AS, ATX.AS B.V, GBX, XAMS/ENA-MAIN, 545] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.L, vpSize 70304, data [ATY.L, ATY.L London PLC, GBX, XLON/LSE-SETS, 475] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.N, vpSize 70304, data [ATY.N, ATY.N Corporation, GBX, XNGS/NAS-GSM, 453] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.OQ, vpSize 70304, data [ATY.OQ, ATY.OQ Co., EUR, XNYS/NYS-MAIN, 665] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.AS, vpSize 70304, data [ATY.AS, ATY.AS B.V, CAD, XAMS/ENA-MAIN, 10] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.L, vpSize 70304, data [ATZ.L, ATZ.L London PLC, GBX, XLON/LSE-SETS, 33] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.N, vpSize 70304, data [ATZ.N, ATZ.N Corporation, CAD, XNGS/NAS-GSM, 173] -09:22:54.390 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.OQ, vpSize 70304, data [ATZ.OQ, ATZ.OQ Co., CAD, XNYS/NYS-MAIN, 229] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.AS, vpSize 70304, data [ATZ.AS, ATZ.AS B.V, USD, XAMS/ENA-MAIN, 168] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.L, vpSize 70304, data [AUA.L, AUA.L London PLC, CAD, XLON/LSE-SETS, 395] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.N, vpSize 70304, data [AUA.N, AUA.N Corporation, GBX, XNGS/NAS-GSM, 87] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.OQ, vpSize 70304, data [AUA.OQ, AUA.OQ Co., USD, XNYS/NYS-MAIN, 60] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.AS, vpSize 70304, data [AUA.AS, AUA.AS B.V, EUR, XAMS/ENA-MAIN, 340] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.L, vpSize 70304, data [AUB.L, AUB.L London PLC, EUR, XLON/LSE-SETS, 745] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.N, vpSize 70304, data [AUB.N, AUB.N Corporation, CAD, XNGS/NAS-GSM, 57] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.OQ, vpSize 70304, data [AUB.OQ, AUB.OQ Co., CAD, XNYS/NYS-MAIN, 340] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.AS, vpSize 70304, data [AUB.AS, AUB.AS B.V, EUR, XAMS/ENA-MAIN, 818] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.L, vpSize 70304, data [AUC.L, AUC.L London PLC, EUR, XLON/LSE-SETS, 96] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.N, vpSize 70304, data [AUC.N, AUC.N Corporation, USD, XNGS/NAS-GSM, 356] -09:22:54.391 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.OQ, vpSize 70304, data [AUC.OQ, AUC.OQ Co., USD, XNYS/NYS-MAIN, 199] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.AS, vpSize 70304, data [AUC.AS, AUC.AS B.V, USD, XAMS/ENA-MAIN, 838] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.L, vpSize 70304, data [AUD.L, AUD.L London PLC, CAD, XLON/LSE-SETS, 278] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.N, vpSize 70304, data [AUD.N, AUD.N Corporation, CAD, XNGS/NAS-GSM, 586] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.OQ, vpSize 70304, data [AUD.OQ, AUD.OQ Co., GBX, XNYS/NYS-MAIN, 414] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.AS, vpSize 70304, data [AUD.AS, AUD.AS B.V, CAD, XAMS/ENA-MAIN, 120] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.L, vpSize 70304, data [AUE.L, AUE.L London PLC, USD, XLON/LSE-SETS, 922] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.N, vpSize 70304, data [AUE.N, AUE.N Corporation, CAD, XNGS/NAS-GSM, 784] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.OQ, vpSize 70304, data [AUE.OQ, AUE.OQ Co., EUR, XNYS/NYS-MAIN, 952] -09:22:54.392 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.AS, vpSize 70304, data [AUE.AS, AUE.AS B.V, CAD, XAMS/ENA-MAIN, 425] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.L, vpSize 70304, data [AUF.L, AUF.L London PLC, GBX, XLON/LSE-SETS, 854] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.N, vpSize 70304, data [AUF.N, AUF.N Corporation, CAD, XNGS/NAS-GSM, 851] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.OQ, vpSize 70304, data [AUF.OQ, AUF.OQ Co., CAD, XNYS/NYS-MAIN, 571] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.AS, vpSize 70304, data [AUF.AS, AUF.AS B.V, EUR, XAMS/ENA-MAIN, 918] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.L, vpSize 70304, data [AUG.L, AUG.L London PLC, GBX, XLON/LSE-SETS, 927] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.N, vpSize 70304, data [AUG.N, AUG.N Corporation, EUR, XNGS/NAS-GSM, 508] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.OQ, vpSize 70304, data [AUG.OQ, AUG.OQ Co., USD, XNYS/NYS-MAIN, 911] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.AS, vpSize 70304, data [AUG.AS, AUG.AS B.V, EUR, XAMS/ENA-MAIN, 410] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.L, vpSize 70304, data [AUH.L, AUH.L London PLC, EUR, XLON/LSE-SETS, 969] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.N, vpSize 70304, data [AUH.N, AUH.N Corporation, CAD, XNGS/NAS-GSM, 950] -09:22:54.393 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.OQ, vpSize 70304, data [AUH.OQ, AUH.OQ Co., EUR, XNYS/NYS-MAIN, 376] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.AS, vpSize 70304, data [AUH.AS, AUH.AS B.V, GBX, XAMS/ENA-MAIN, 293] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.L, vpSize 70304, data [AUI.L, AUI.L London PLC, USD, XLON/LSE-SETS, 748] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.N, vpSize 70304, data [AUI.N, AUI.N Corporation, CAD, XNGS/NAS-GSM, 740] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.OQ, vpSize 70304, data [AUI.OQ, AUI.OQ Co., CAD, XNYS/NYS-MAIN, 418] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.AS, vpSize 70304, data [AUI.AS, AUI.AS B.V, USD, XAMS/ENA-MAIN, 489] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.L, vpSize 70304, data [AUJ.L, AUJ.L London PLC, USD, XLON/LSE-SETS, 612] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.N, vpSize 70304, data [AUJ.N, AUJ.N Corporation, EUR, XNGS/NAS-GSM, 46] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.OQ, vpSize 70304, data [AUJ.OQ, AUJ.OQ Co., CAD, XNYS/NYS-MAIN, 68] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.AS, vpSize 70304, data [AUJ.AS, AUJ.AS B.V, GBX, XAMS/ENA-MAIN, 0] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.L, vpSize 70304, data [AUK.L, AUK.L London PLC, CAD, XLON/LSE-SETS, 66] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.N, vpSize 70304, data [AUK.N, AUK.N Corporation, EUR, XNGS/NAS-GSM, 218] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.OQ, vpSize 70304, data [AUK.OQ, AUK.OQ Co., CAD, XNYS/NYS-MAIN, 104] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.AS, vpSize 70304, data [AUK.AS, AUK.AS B.V, GBX, XAMS/ENA-MAIN, 273] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.L, vpSize 70304, data [AUL.L, AUL.L London PLC, USD, XLON/LSE-SETS, 678] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.N, vpSize 70304, data [AUL.N, AUL.N Corporation, EUR, XNGS/NAS-GSM, 756] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.OQ, vpSize 70304, data [AUL.OQ, AUL.OQ Co., EUR, XNYS/NYS-MAIN, 246] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.AS, vpSize 70304, data [AUL.AS, AUL.AS B.V, USD, XAMS/ENA-MAIN, 707] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.L, vpSize 70304, data [AUM.L, AUM.L London PLC, CAD, XLON/LSE-SETS, 998] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.N, vpSize 70304, data [AUM.N, AUM.N Corporation, USD, XNGS/NAS-GSM, 8] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.OQ, vpSize 70304, data [AUM.OQ, AUM.OQ Co., EUR, XNYS/NYS-MAIN, 286] -09:22:54.394 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.AS, vpSize 70304, data [AUM.AS, AUM.AS B.V, CAD, XAMS/ENA-MAIN, 654] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.L, vpSize 70304, data [AUN.L, AUN.L London PLC, GBX, XLON/LSE-SETS, 69] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.N, vpSize 70304, data [AUN.N, AUN.N Corporation, GBX, XNGS/NAS-GSM, 44] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.OQ, vpSize 70304, data [AUN.OQ, AUN.OQ Co., EUR, XNYS/NYS-MAIN, 573] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.AS, vpSize 70304, data [AUN.AS, AUN.AS B.V, USD, XAMS/ENA-MAIN, 78] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.L, vpSize 70304, data [AUO.L, AUO.L London PLC, EUR, XLON/LSE-SETS, 535] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.N, vpSize 70304, data [AUO.N, AUO.N Corporation, USD, XNGS/NAS-GSM, 673] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.OQ, vpSize 70304, data [AUO.OQ, AUO.OQ Co., USD, XNYS/NYS-MAIN, 548] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.AS, vpSize 70304, data [AUO.AS, AUO.AS B.V, CAD, XAMS/ENA-MAIN, 721] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.L, vpSize 70304, data [AUP.L, AUP.L London PLC, EUR, XLON/LSE-SETS, 289] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.N, vpSize 70304, data [AUP.N, AUP.N Corporation, CAD, XNGS/NAS-GSM, 297] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.OQ, vpSize 70304, data [AUP.OQ, AUP.OQ Co., GBX, XNYS/NYS-MAIN, 341] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.AS, vpSize 70304, data [AUP.AS, AUP.AS B.V, USD, XAMS/ENA-MAIN, 461] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.L, vpSize 70304, data [AUQ.L, AUQ.L London PLC, CAD, XLON/LSE-SETS, 371] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.N, vpSize 70304, data [AUQ.N, AUQ.N Corporation, EUR, XNGS/NAS-GSM, 439] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.OQ, vpSize 70304, data [AUQ.OQ, AUQ.OQ Co., EUR, XNYS/NYS-MAIN, 967] -09:22:54.395 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.AS, vpSize 70304, data [AUQ.AS, AUQ.AS B.V, EUR, XAMS/ENA-MAIN, 949] -09:22:54.457 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 141 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:54.457 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATH.AS, vpSize 70304, data [ATH.AS, ATH.AS B.V, GBX, XAMS/ENA-MAIN, 161] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.L, vpSize 70304, data [ATI.L, ATI.L London PLC, CAD, XLON/LSE-SETS, 858] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.N, vpSize 70304, data [ATI.N, ATI.N Corporation, CAD, XNGS/NAS-GSM, 944] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.OQ, vpSize 70304, data [ATI.OQ, ATI.OQ Co., USD, XNYS/NYS-MAIN, 114] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATI.AS, vpSize 70304, data [ATI.AS, ATI.AS B.V, EUR, XAMS/ENA-MAIN, 289] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.L, vpSize 70304, data [ATJ.L, ATJ.L London PLC, CAD, XLON/LSE-SETS, 476] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.N, vpSize 70304, data [ATJ.N, ATJ.N Corporation, CAD, XNGS/NAS-GSM, 616] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.OQ, vpSize 70304, data [ATJ.OQ, ATJ.OQ Co., EUR, XNYS/NYS-MAIN, 8] -09:22:54.458 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATJ.AS, vpSize 70304, data [ATJ.AS, ATJ.AS B.V, EUR, XAMS/ENA-MAIN, 233] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.L, vpSize 70304, data [ATK.L, ATK.L London PLC, USD, XLON/LSE-SETS, 965] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.N, vpSize 70304, data [ATK.N, ATK.N Corporation, EUR, XNGS/NAS-GSM, 725] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.OQ, vpSize 70304, data [ATK.OQ, ATK.OQ Co., EUR, XNYS/NYS-MAIN, 11] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATK.AS, vpSize 70304, data [ATK.AS, ATK.AS B.V, USD, XAMS/ENA-MAIN, 322] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.L, vpSize 70304, data [ATL.L, ATL.L London PLC, CAD, XLON/LSE-SETS, 294] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.N, vpSize 70304, data [ATL.N, ATL.N Corporation, CAD, XNGS/NAS-GSM, 741] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.OQ, vpSize 70304, data [ATL.OQ, ATL.OQ Co., USD, XNYS/NYS-MAIN, 595] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATL.AS, vpSize 70304, data [ATL.AS, ATL.AS B.V, EUR, XAMS/ENA-MAIN, 743] -09:22:54.459 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.L, vpSize 70304, data [ATM.L, ATM.L London PLC, GBX, XLON/LSE-SETS, 346] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.N, vpSize 70304, data [ATM.N, ATM.N Corporation, EUR, XNGS/NAS-GSM, 705] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.OQ, vpSize 70304, data [ATM.OQ, ATM.OQ Co., CAD, XNYS/NYS-MAIN, 632] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATM.AS, vpSize 70304, data [ATM.AS, ATM.AS B.V, GBX, XAMS/ENA-MAIN, 126] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.L, vpSize 70304, data [ATN.L, ATN.L London PLC, EUR, XLON/LSE-SETS, 736] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.N, vpSize 70304, data [ATN.N, ATN.N Corporation, GBX, XNGS/NAS-GSM, 940] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.OQ, vpSize 70304, data [ATN.OQ, ATN.OQ Co., GBX, XNYS/NYS-MAIN, 710] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATN.AS, vpSize 70304, data [ATN.AS, ATN.AS B.V, GBX, XAMS/ENA-MAIN, 429] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.L, vpSize 70304, data [ATO.L, ATO.L London PLC, EUR, XLON/LSE-SETS, 584] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.N, vpSize 70304, data [ATO.N, ATO.N Corporation, USD, XNGS/NAS-GSM, 200] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.OQ, vpSize 70304, data [ATO.OQ, ATO.OQ Co., CAD, XNYS/NYS-MAIN, 841] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATO.AS, vpSize 70304, data [ATO.AS, ATO.AS B.V, EUR, XAMS/ENA-MAIN, 583] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.L, vpSize 70304, data [ATP.L, ATP.L London PLC, USD, XLON/LSE-SETS, 450] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.N, vpSize 70304, data [ATP.N, ATP.N Corporation, USD, XNGS/NAS-GSM, 870] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.OQ, vpSize 70304, data [ATP.OQ, ATP.OQ Co., GBX, XNYS/NYS-MAIN, 775] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATP.AS, vpSize 70304, data [ATP.AS, ATP.AS B.V, EUR, XAMS/ENA-MAIN, 735] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.L, vpSize 70304, data [ATQ.L, ATQ.L London PLC, CAD, XLON/LSE-SETS, 540] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.N, vpSize 70304, data [ATQ.N, ATQ.N Corporation, USD, XNGS/NAS-GSM, 924] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.OQ, vpSize 70304, data [ATQ.OQ, ATQ.OQ Co., USD, XNYS/NYS-MAIN, 58] -09:22:54.460 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATQ.AS, vpSize 70304, data [ATQ.AS, ATQ.AS B.V, CAD, XAMS/ENA-MAIN, 378] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.L, vpSize 70304, data [ATR.L, ATR.L London PLC, EUR, XLON/LSE-SETS, 514] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.N, vpSize 70304, data [ATR.N, ATR.N Corporation, GBX, XNGS/NAS-GSM, 38] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.OQ, vpSize 70304, data [ATR.OQ, ATR.OQ Co., USD, XNYS/NYS-MAIN, 197] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATR.AS, vpSize 70304, data [ATR.AS, ATR.AS B.V, GBX, XAMS/ENA-MAIN, 591] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.L, vpSize 70304, data [ATS.L, ATS.L London PLC, EUR, XLON/LSE-SETS, 110] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.N, vpSize 70304, data [ATS.N, ATS.N Corporation, USD, XNGS/NAS-GSM, 295] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.OQ, vpSize 70304, data [ATS.OQ, ATS.OQ Co., USD, XNYS/NYS-MAIN, 940] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATS.AS, vpSize 70304, data [ATS.AS, ATS.AS B.V, CAD, XAMS/ENA-MAIN, 7] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.L, vpSize 70304, data [ATT.L, ATT.L London PLC, USD, XLON/LSE-SETS, 375] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.N, vpSize 70304, data [ATT.N, ATT.N Corporation, USD, XNGS/NAS-GSM, 726] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.OQ, vpSize 70304, data [ATT.OQ, ATT.OQ Co., USD, XNYS/NYS-MAIN, 390] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATT.AS, vpSize 70304, data [ATT.AS, ATT.AS B.V, GBX, XAMS/ENA-MAIN, 542] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.L, vpSize 70304, data [ATU.L, ATU.L London PLC, EUR, XLON/LSE-SETS, 155] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.N, vpSize 70304, data [ATU.N, ATU.N Corporation, EUR, XNGS/NAS-GSM, 356] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.OQ, vpSize 70304, data [ATU.OQ, ATU.OQ Co., GBX, XNYS/NYS-MAIN, 436] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATU.AS, vpSize 70304, data [ATU.AS, ATU.AS B.V, CAD, XAMS/ENA-MAIN, 738] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.L, vpSize 70304, data [ATV.L, ATV.L London PLC, EUR, XLON/LSE-SETS, 791] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.N, vpSize 70304, data [ATV.N, ATV.N Corporation, EUR, XNGS/NAS-GSM, 98] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.OQ, vpSize 70304, data [ATV.OQ, ATV.OQ Co., GBX, XNYS/NYS-MAIN, 193] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATV.AS, vpSize 70304, data [ATV.AS, ATV.AS B.V, EUR, XAMS/ENA-MAIN, 129] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.L, vpSize 70304, data [ATW.L, ATW.L London PLC, CAD, XLON/LSE-SETS, 731] -09:22:54.461 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.N, vpSize 70304, data [ATW.N, ATW.N Corporation, USD, XNGS/NAS-GSM, 205] -09:22:54.462 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.OQ, vpSize 70304, data [ATW.OQ, ATW.OQ Co., EUR, XNYS/NYS-MAIN, 17] -09:22:54.462 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATW.AS, vpSize 70304, data [ATW.AS, ATW.AS B.V, CAD, XAMS/ENA-MAIN, 157] -09:22:54.462 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.L, vpSize 70304, data [ATX.L, ATX.L London PLC, CAD, XLON/LSE-SETS, 352] -09:22:54.462 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.N, vpSize 70304, data [ATX.N, ATX.N Corporation, EUR, XNGS/NAS-GSM, 964] -09:22:54.462 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.OQ, vpSize 70304, data [ATX.OQ, ATX.OQ Co., USD, XNYS/NYS-MAIN, 668] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATX.AS, vpSize 70304, data [ATX.AS, ATX.AS B.V, GBX, XAMS/ENA-MAIN, 545] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.L, vpSize 70304, data [ATY.L, ATY.L London PLC, GBX, XLON/LSE-SETS, 475] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.N, vpSize 70304, data [ATY.N, ATY.N Corporation, GBX, XNGS/NAS-GSM, 453] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.OQ, vpSize 70304, data [ATY.OQ, ATY.OQ Co., EUR, XNYS/NYS-MAIN, 665] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATY.AS, vpSize 70304, data [ATY.AS, ATY.AS B.V, CAD, XAMS/ENA-MAIN, 10] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.L, vpSize 70304, data [ATZ.L, ATZ.L London PLC, GBX, XLON/LSE-SETS, 33] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.N, vpSize 70304, data [ATZ.N, ATZ.N Corporation, CAD, XNGS/NAS-GSM, 173] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.OQ, vpSize 70304, data [ATZ.OQ, ATZ.OQ Co., CAD, XNYS/NYS-MAIN, 229] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key ATZ.AS, vpSize 70304, data [ATZ.AS, ATZ.AS B.V, USD, XAMS/ENA-MAIN, 168] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.L, vpSize 70304, data [AUA.L, AUA.L London PLC, CAD, XLON/LSE-SETS, 395] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.N, vpSize 70304, data [AUA.N, AUA.N Corporation, GBX, XNGS/NAS-GSM, 87] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.OQ, vpSize 70304, data [AUA.OQ, AUA.OQ Co., USD, XNYS/NYS-MAIN, 60] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUA.AS, vpSize 70304, data [AUA.AS, AUA.AS B.V, EUR, XAMS/ENA-MAIN, 340] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.L, vpSize 70304, data [AUB.L, AUB.L London PLC, EUR, XLON/LSE-SETS, 745] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.N, vpSize 70304, data [AUB.N, AUB.N Corporation, CAD, XNGS/NAS-GSM, 57] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.OQ, vpSize 70304, data [AUB.OQ, AUB.OQ Co., CAD, XNYS/NYS-MAIN, 340] -09:22:54.463 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUB.AS, vpSize 70304, data [AUB.AS, AUB.AS B.V, EUR, XAMS/ENA-MAIN, 818] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.L, vpSize 70304, data [AUC.L, AUC.L London PLC, EUR, XLON/LSE-SETS, 96] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.N, vpSize 70304, data [AUC.N, AUC.N Corporation, USD, XNGS/NAS-GSM, 356] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.OQ, vpSize 70304, data [AUC.OQ, AUC.OQ Co., USD, XNYS/NYS-MAIN, 199] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUC.AS, vpSize 70304, data [AUC.AS, AUC.AS B.V, USD, XAMS/ENA-MAIN, 838] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.L, vpSize 70304, data [AUD.L, AUD.L London PLC, CAD, XLON/LSE-SETS, 278] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.N, vpSize 70304, data [AUD.N, AUD.N Corporation, CAD, XNGS/NAS-GSM, 586] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.OQ, vpSize 70304, data [AUD.OQ, AUD.OQ Co., GBX, XNYS/NYS-MAIN, 414] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUD.AS, vpSize 70304, data [AUD.AS, AUD.AS B.V, CAD, XAMS/ENA-MAIN, 120] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.L, vpSize 70304, data [AUE.L, AUE.L London PLC, USD, XLON/LSE-SETS, 922] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.N, vpSize 70304, data [AUE.N, AUE.N Corporation, CAD, XNGS/NAS-GSM, 784] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.OQ, vpSize 70304, data [AUE.OQ, AUE.OQ Co., EUR, XNYS/NYS-MAIN, 952] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUE.AS, vpSize 70304, data [AUE.AS, AUE.AS B.V, CAD, XAMS/ENA-MAIN, 425] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.L, vpSize 70304, data [AUF.L, AUF.L London PLC, GBX, XLON/LSE-SETS, 854] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.N, vpSize 70304, data [AUF.N, AUF.N Corporation, CAD, XNGS/NAS-GSM, 851] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.OQ, vpSize 70304, data [AUF.OQ, AUF.OQ Co., CAD, XNYS/NYS-MAIN, 571] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUF.AS, vpSize 70304, data [AUF.AS, AUF.AS B.V, EUR, XAMS/ENA-MAIN, 918] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.L, vpSize 70304, data [AUG.L, AUG.L London PLC, GBX, XLON/LSE-SETS, 927] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.N, vpSize 70304, data [AUG.N, AUG.N Corporation, EUR, XNGS/NAS-GSM, 508] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.OQ, vpSize 70304, data [AUG.OQ, AUG.OQ Co., USD, XNYS/NYS-MAIN, 911] -09:22:54.464 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUG.AS, vpSize 70304, data [AUG.AS, AUG.AS B.V, EUR, XAMS/ENA-MAIN, 410] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.L, vpSize 70304, data [AUH.L, AUH.L London PLC, EUR, XLON/LSE-SETS, 969] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.N, vpSize 70304, data [AUH.N, AUH.N Corporation, CAD, XNGS/NAS-GSM, 950] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.OQ, vpSize 70304, data [AUH.OQ, AUH.OQ Co., EUR, XNYS/NYS-MAIN, 376] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUH.AS, vpSize 70304, data [AUH.AS, AUH.AS B.V, GBX, XAMS/ENA-MAIN, 293] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.L, vpSize 70304, data [AUI.L, AUI.L London PLC, USD, XLON/LSE-SETS, 748] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.N, vpSize 70304, data [AUI.N, AUI.N Corporation, CAD, XNGS/NAS-GSM, 740] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.OQ, vpSize 70304, data [AUI.OQ, AUI.OQ Co., CAD, XNYS/NYS-MAIN, 418] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUI.AS, vpSize 70304, data [AUI.AS, AUI.AS B.V, USD, XAMS/ENA-MAIN, 489] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.L, vpSize 70304, data [AUJ.L, AUJ.L London PLC, USD, XLON/LSE-SETS, 612] -09:22:54.465 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.N, vpSize 70304, data [AUJ.N, AUJ.N Corporation, EUR, XNGS/NAS-GSM, 46] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.OQ, vpSize 70304, data [AUJ.OQ, AUJ.OQ Co., CAD, XNYS/NYS-MAIN, 68] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUJ.AS, vpSize 70304, data [AUJ.AS, AUJ.AS B.V, GBX, XAMS/ENA-MAIN, 0] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.L, vpSize 70304, data [AUK.L, AUK.L London PLC, CAD, XLON/LSE-SETS, 66] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.N, vpSize 70304, data [AUK.N, AUK.N Corporation, EUR, XNGS/NAS-GSM, 218] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.OQ, vpSize 70304, data [AUK.OQ, AUK.OQ Co., CAD, XNYS/NYS-MAIN, 104] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUK.AS, vpSize 70304, data [AUK.AS, AUK.AS B.V, GBX, XAMS/ENA-MAIN, 273] -09:22:54.466 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.L, vpSize 70304, data [AUL.L, AUL.L London PLC, USD, XLON/LSE-SETS, 678] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.N, vpSize 70304, data [AUL.N, AUL.N Corporation, EUR, XNGS/NAS-GSM, 756] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.OQ, vpSize 70304, data [AUL.OQ, AUL.OQ Co., EUR, XNYS/NYS-MAIN, 246] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUL.AS, vpSize 70304, data [AUL.AS, AUL.AS B.V, USD, XAMS/ENA-MAIN, 707] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.L, vpSize 70304, data [AUM.L, AUM.L London PLC, CAD, XLON/LSE-SETS, 998] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.N, vpSize 70304, data [AUM.N, AUM.N Corporation, USD, XNGS/NAS-GSM, 8] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.OQ, vpSize 70304, data [AUM.OQ, AUM.OQ Co., EUR, XNYS/NYS-MAIN, 286] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUM.AS, vpSize 70304, data [AUM.AS, AUM.AS B.V, CAD, XAMS/ENA-MAIN, 654] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.L, vpSize 70304, data [AUN.L, AUN.L London PLC, GBX, XLON/LSE-SETS, 69] -09:22:54.467 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.N, vpSize 70304, data [AUN.N, AUN.N Corporation, GBX, XNGS/NAS-GSM, 44] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.OQ, vpSize 70304, data [AUN.OQ, AUN.OQ Co., EUR, XNYS/NYS-MAIN, 573] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUN.AS, vpSize 70304, data [AUN.AS, AUN.AS B.V, USD, XAMS/ENA-MAIN, 78] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.L, vpSize 70304, data [AUO.L, AUO.L London PLC, EUR, XLON/LSE-SETS, 535] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.N, vpSize 70304, data [AUO.N, AUO.N Corporation, USD, XNGS/NAS-GSM, 673] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.OQ, vpSize 70304, data [AUO.OQ, AUO.OQ Co., USD, XNYS/NYS-MAIN, 548] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUO.AS, vpSize 70304, data [AUO.AS, AUO.AS B.V, CAD, XAMS/ENA-MAIN, 721] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.L, vpSize 70304, data [AUP.L, AUP.L London PLC, EUR, XLON/LSE-SETS, 289] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.N, vpSize 70304, data [AUP.N, AUP.N Corporation, CAD, XNGS/NAS-GSM, 297] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.OQ, vpSize 70304, data [AUP.OQ, AUP.OQ Co., GBX, XNYS/NYS-MAIN, 341] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUP.AS, vpSize 70304, data [AUP.AS, AUP.AS B.V, USD, XAMS/ENA-MAIN, 461] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.L, vpSize 70304, data [AUQ.L, AUQ.L London PLC, CAD, XLON/LSE-SETS, 371] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.N, vpSize 70304, data [AUQ.N, AUQ.N Corporation, EUR, XNGS/NAS-GSM, 439] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.OQ, vpSize 70304, data [AUQ.OQ, AUQ.OQ Co., EUR, XNYS/NYS-MAIN, 967] -09:22:54.468 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUQ.AS, vpSize 70304, data [AUQ.AS, AUQ.AS B.V, EUR, XAMS/ENA-MAIN, 949] -09:22:55.106 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 2048 to 2189 -09:22:55.143 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 2048->2189 -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 41 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUR.L, vpSize 70304, data [AUR.L, AUR.L London PLC, CAD, XLON/LSE-SETS, 799] -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUR.N, vpSize 70304, data [AUR.N, AUR.N Corporation, CAD, XNGS/NAS-GSM, 524] -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUR.OQ, vpSize 70304, data [AUR.OQ, AUR.OQ Co., GBX, XNYS/NYS-MAIN, 599] -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUR.AS, vpSize 70304, data [AUR.AS, AUR.AS B.V, CAD, XAMS/ENA-MAIN, 259] -09:22:55.223 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUS.L, vpSize 70304, data [AUS.L, AUS.L London PLC, CAD, XLON/LSE-SETS, 529] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUS.N, vpSize 70304, data [AUS.N, AUS.N Corporation, EUR, XNGS/NAS-GSM, 958] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUS.OQ, vpSize 70304, data [AUS.OQ, AUS.OQ Co., CAD, XNYS/NYS-MAIN, 143] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUS.AS, vpSize 70304, data [AUS.AS, AUS.AS B.V, CAD, XAMS/ENA-MAIN, 508] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUT.L, vpSize 70304, data [AUT.L, AUT.L London PLC, CAD, XLON/LSE-SETS, 710] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUT.N, vpSize 70304, data [AUT.N, AUT.N Corporation, EUR, XNGS/NAS-GSM, 440] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUT.OQ, vpSize 70304, data [AUT.OQ, AUT.OQ Co., GBX, XNYS/NYS-MAIN, 361] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUT.AS, vpSize 70304, data [AUT.AS, AUT.AS B.V, CAD, XAMS/ENA-MAIN, 849] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUU.L, vpSize 70304, data [AUU.L, AUU.L London PLC, GBX, XLON/LSE-SETS, 823] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUU.N, vpSize 70304, data [AUU.N, AUU.N Corporation, CAD, XNGS/NAS-GSM, 382] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUU.OQ, vpSize 70304, data [AUU.OQ, AUU.OQ Co., GBX, XNYS/NYS-MAIN, 850] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUU.AS, vpSize 70304, data [AUU.AS, AUU.AS B.V, EUR, XAMS/ENA-MAIN, 650] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUV.L, vpSize 70304, data [AUV.L, AUV.L London PLC, CAD, XLON/LSE-SETS, 605] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUV.N, vpSize 70304, data [AUV.N, AUV.N Corporation, GBX, XNGS/NAS-GSM, 287] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUV.OQ, vpSize 70304, data [AUV.OQ, AUV.OQ Co., EUR, XNYS/NYS-MAIN, 729] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUV.AS, vpSize 70304, data [AUV.AS, AUV.AS B.V, EUR, XAMS/ENA-MAIN, 235] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUW.L, vpSize 70304, data [AUW.L, AUW.L London PLC, USD, XLON/LSE-SETS, 284] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUW.N, vpSize 70304, data [AUW.N, AUW.N Corporation, GBX, XNGS/NAS-GSM, 340] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUW.OQ, vpSize 70304, data [AUW.OQ, AUW.OQ Co., EUR, XNYS/NYS-MAIN, 566] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUW.AS, vpSize 70304, data [AUW.AS, AUW.AS B.V, GBX, XAMS/ENA-MAIN, 216] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUX.L, vpSize 70304, data [AUX.L, AUX.L London PLC, USD, XLON/LSE-SETS, 49] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUX.N, vpSize 70304, data [AUX.N, AUX.N Corporation, GBX, XNGS/NAS-GSM, 213] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUX.OQ, vpSize 70304, data [AUX.OQ, AUX.OQ Co., CAD, XNYS/NYS-MAIN, 989] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUX.AS, vpSize 70304, data [AUX.AS, AUX.AS B.V, EUR, XAMS/ENA-MAIN, 426] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUY.L, vpSize 70304, data [AUY.L, AUY.L London PLC, GBX, XLON/LSE-SETS, 822] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUY.N, vpSize 70304, data [AUY.N, AUY.N Corporation, USD, XNGS/NAS-GSM, 96] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUY.OQ, vpSize 70304, data [AUY.OQ, AUY.OQ Co., EUR, XNYS/NYS-MAIN, 19] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUY.AS, vpSize 70304, data [AUY.AS, AUY.AS B.V, USD, XAMS/ENA-MAIN, 569] -09:22:55.224 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUZ.L, vpSize 70304, data [AUZ.L, AUZ.L London PLC, CAD, XLON/LSE-SETS, 795] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUZ.N, vpSize 70304, data [AUZ.N, AUZ.N Corporation, GBX, XNGS/NAS-GSM, 379] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUZ.OQ, vpSize 70304, data [AUZ.OQ, AUZ.OQ Co., USD, XNYS/NYS-MAIN, 909] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AUZ.AS, vpSize 70304, data [AUZ.AS, AUZ.AS B.V, EUR, XAMS/ENA-MAIN, 49] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVA.L, vpSize 70304, data [AVA.L, AVA.L London PLC, USD, XLON/LSE-SETS, 356] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVA.N, vpSize 70304, data [AVA.N, AVA.N Corporation, EUR, XNGS/NAS-GSM, 335] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVA.OQ, vpSize 70304, data [AVA.OQ, AVA.OQ Co., GBX, XNYS/NYS-MAIN, 805] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVA.AS, vpSize 70304, data [AVA.AS, AVA.AS B.V, GBX, XAMS/ENA-MAIN, 815] -09:22:55.225 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVB.L, vpSize 70304, data [AVB.L, AVB.L London PLC, EUR, XLON/LSE-SETS, 671] -09:22:56.116 [vpChangeThread1] INFO i.v.vuu.client.swing.client.Worker - VP Range Change -> 2089 to 2230 -09:22:56.188 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] Range Resp 2089->2230 -09:22:56.276 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - [VP] updates 41 for user-0e81f2ed-192e-474f-b41a-b7d342615847 rowSize = 70304 -09:22:56.276 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVB.N, vpSize 70304, data [AVB.N, AVB.N Corporation, EUR, XNGS/NAS-GSM, 949] -09:22:56.276 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVB.OQ, vpSize 70304, data [AVB.OQ, AVB.OQ Co., GBX, XNYS/NYS-MAIN, 830] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVB.AS, vpSize 70304, data [AVB.AS, AVB.AS B.V, EUR, XAMS/ENA-MAIN, 883] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVC.L, vpSize 70304, data [AVC.L, AVC.L London PLC, CAD, XLON/LSE-SETS, 468] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVC.N, vpSize 70304, data [AVC.N, AVC.N Corporation, USD, XNGS/NAS-GSM, 842] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVC.OQ, vpSize 70304, data [AVC.OQ, AVC.OQ Co., USD, XNYS/NYS-MAIN, 237] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVC.AS, vpSize 70304, data [AVC.AS, AVC.AS B.V, CAD, XAMS/ENA-MAIN, 254] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVD.L, vpSize 70304, data [AVD.L, AVD.L London PLC, GBX, XLON/LSE-SETS, 597] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVD.N, vpSize 70304, data [AVD.N, AVD.N Corporation, USD, XNGS/NAS-GSM, 724] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVD.OQ, vpSize 70304, data [AVD.OQ, AVD.OQ Co., EUR, XNYS/NYS-MAIN, 488] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVD.AS, vpSize 70304, data [AVD.AS, AVD.AS B.V, EUR, XAMS/ENA-MAIN, 466] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVE.L, vpSize 70304, data [AVE.L, AVE.L London PLC, USD, XLON/LSE-SETS, 269] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVE.N, vpSize 70304, data [AVE.N, AVE.N Corporation, EUR, XNGS/NAS-GSM, 747] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVE.OQ, vpSize 70304, data [AVE.OQ, AVE.OQ Co., EUR, XNYS/NYS-MAIN, 408] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVE.AS, vpSize 70304, data [AVE.AS, AVE.AS B.V, USD, XAMS/ENA-MAIN, 119] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVF.L, vpSize 70304, data [AVF.L, AVF.L London PLC, USD, XLON/LSE-SETS, 363] -09:22:56.277 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVF.N, vpSize 70304, data [AVF.N, AVF.N Corporation, EUR, XNGS/NAS-GSM, 347] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVF.OQ, vpSize 70304, data [AVF.OQ, AVF.OQ Co., CAD, XNYS/NYS-MAIN, 576] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVF.AS, vpSize 70304, data [AVF.AS, AVF.AS B.V, USD, XAMS/ENA-MAIN, 657] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVG.L, vpSize 70304, data [AVG.L, AVG.L London PLC, USD, XLON/LSE-SETS, 6] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVG.N, vpSize 70304, data [AVG.N, AVG.N Corporation, USD, XNGS/NAS-GSM, 631] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVG.OQ, vpSize 70304, data [AVG.OQ, AVG.OQ Co., EUR, XNYS/NYS-MAIN, 797] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVG.AS, vpSize 70304, data [AVG.AS, AVG.AS B.V, EUR, XAMS/ENA-MAIN, 540] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVH.L, vpSize 70304, data [AVH.L, AVH.L London PLC, GBX, XLON/LSE-SETS, 63] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVH.N, vpSize 70304, data [AVH.N, AVH.N Corporation, USD, XNGS/NAS-GSM, 949] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVH.OQ, vpSize 70304, data [AVH.OQ, AVH.OQ Co., EUR, XNYS/NYS-MAIN, 261] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVH.AS, vpSize 70304, data [AVH.AS, AVH.AS B.V, USD, XAMS/ENA-MAIN, 99] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVI.L, vpSize 70304, data [AVI.L, AVI.L London PLC, EUR, XLON/LSE-SETS, 580] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVI.N, vpSize 70304, data [AVI.N, AVI.N Corporation, GBX, XNGS/NAS-GSM, 62] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVI.OQ, vpSize 70304, data [AVI.OQ, AVI.OQ Co., CAD, XNYS/NYS-MAIN, 730] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVI.AS, vpSize 70304, data [AVI.AS, AVI.AS B.V, USD, XAMS/ENA-MAIN, 730] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVJ.L, vpSize 70304, data [AVJ.L, AVJ.L London PLC, CAD, XLON/LSE-SETS, 737] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVJ.N, vpSize 70304, data [AVJ.N, AVJ.N Corporation, EUR, XNGS/NAS-GSM, 636] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVJ.OQ, vpSize 70304, data [AVJ.OQ, AVJ.OQ Co., GBX, XNYS/NYS-MAIN, 510] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVJ.AS, vpSize 70304, data [AVJ.AS, AVJ.AS B.V, CAD, XAMS/ENA-MAIN, 617] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVK.L, vpSize 70304, data [AVK.L, AVK.L London PLC, USD, XLON/LSE-SETS, 254] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVK.N, vpSize 70304, data [AVK.N, AVK.N Corporation, USD, XNGS/NAS-GSM, 187] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVK.OQ, vpSize 70304, data [AVK.OQ, AVK.OQ Co., USD, XNYS/NYS-MAIN, 391] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVK.AS, vpSize 70304, data [AVK.AS, AVK.AS B.V, CAD, XAMS/ENA-MAIN, 369] -09:22:56.278 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVL.L, vpSize 70304, data [AVL.L, AVL.L London PLC, USD, XLON/LSE-SETS, 246] -09:22:56.279 [clientDequeThread1] INFO i.v.vuu.client.swing.client.Worker - ROW: key AVL.N, vpSize 70304, data [AVL.N, AVL.N Corporation, USD, XNGS/NAS-GSM, 866] diff --git a/vuu/src/main/resources/runconfigurations/SimulMain.run.xml b/vuu/src/main/resources/runconfigurations/SimulMain.run.xml index 758b0d727..a9e6b0c2f 100644 --- a/vuu/src/main/resources/runconfigurations/SimulMain.run.xml +++ b/vuu/src/main/resources/runconfigurations/SimulMain.run.xml @@ -3,7 +3,7 @@