diff --git a/.expo/README.md b/.expo/README.md deleted file mode 100644 index 563b815..0000000 --- a/.expo/README.md +++ /dev/null @@ -1,14 +0,0 @@ -> Why do I have a folder named ".expo" in my project? - -The ".expo" folder is created when an Expo project is started using "expo start" command. - -> What do the files contain? - -- "devices.json": contains information about devices that have recently opened this project. This is used to populate the "Development sessions" list in your development builds. -- "settings.json": contains the server configuration that is used to serve the application manifest. -- "dev/logs/": contains structured JSONL event logs from CLI commands (e.g. start.log, export.log). These are truncated on each run. - -> Should I commit the ".expo" folder? - -No, you should not share the ".expo" folder. It does not contain any information that is relevant for other developers working on the project, it is specific to your machine. -Upon project creation, the ".expo" folder is already added to your ".gitignore" file. diff --git a/.expo/dev/logs/export.log b/.expo/dev/logs/export.log deleted file mode 100644 index e67fe5d..0000000 --- a/.expo/dev/logs/export.log +++ /dev/null @@ -1,1614 +0,0 @@ -{"_e":"root:init","_t":1784253878236,"format":"v0-jsonl","version":"57.0.8"} -{"_e":"env:mode","_t":1784253880647,"nodeEnv":"production","babelEnv":"production","mode":"production"} -{"_e":"env:load","_t":1784253880651,"mode":"production","files":[],"env":{}} -{"_e":"devserver:start","_t":1784253880827,"mode":"production","web":true,"baseUrl":"","asyncRoutes":false,"routerRoot":"../../../app","serverComponents":false,"serverActions":false,"serverRendering":false,"apiRoutes":false,"exporting":true} -{"_e":"metro:config","_t":1784253886093,"serverRoot":"../../..","projectRoot":"../../..","exporting":true,"flags":{"autolinkingModuleResolution":false,"serverActions":false,"serverComponents":false,"reactCompiler":false,"optimizeGraph":false,"treeshaking":false,"logbox":false}} -{"_e":"metro:instantiate","_t":1784253887619,"atlas":false,"workers":3,"host":null,"port":null} -{"_e":"metro:bundling:started","_t":1784253893077,"id":"1","platform":"web","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784253893078,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:started","_t":1784253893079,"id":"2","platform":"ios","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784253893079,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253893079,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:started","_t":1784253893079,"id":"3","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784253893079,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253893079,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253893079,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901644,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901645,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901645,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901768,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901769,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901769,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901869,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901869,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253901869,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903234,"id":"1","progress":0.010000000000000002,"total":1,"current":1} -{"_e":"metro:bundling:progress","_t":1784253903235,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903235,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903336,"id":"1","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253903336,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903336,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903846,"id":"1","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253903846,"id":"2","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903846,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253903947,"id":"1","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253903947,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253903947,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784253904339,"id":"1","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904339,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904339,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904440,"id":"1","progress":0.04000000000000001,"total":33,"current":6} -{"_e":"metro:bundling:progress","_t":1784253904440,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904440,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904542,"id":"1","progress":0.044995408631772274,"total":33,"current":7} -{"_e":"metro:bundling:progress","_t":1784253904542,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904542,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904643,"id":"1","progress":0.044995408631772274,"total":58,"current":11} -{"_e":"metro:bundling:progress","_t":1784253904643,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904643,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904743,"id":"1","progress":0.048039031713267025,"total":73,"current":16} -{"_e":"metro:bundling:progress","_t":1784253904743,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904743,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904843,"id":"1","progress":0.07111111111111111,"total":75,"current":20} -{"_e":"metro:bundling:progress","_t":1784253904843,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904843,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253904945,"id":"1","progress":0.0749716553287982,"total":84,"current":23} -{"_e":"metro:bundling:progress","_t":1784253904945,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253904945,"id":"3","progress":0.04000000000000001,"total":3,"current":2} -{"_e":"metro:bundling:progress","_t":1784253905045,"id":"1","progress":0.0749716553287982,"total":84,"current":23} -{"_e":"metro:bundling:progress","_t":1784253905045,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253905045,"id":"3","progress":0.04000000000000001,"total":50,"current":7} -{"_e":"metro:bundling:progress","_t":1784253905146,"id":"1","progress":0.0749716553287982,"total":84,"current":23} -{"_e":"metro:bundling:progress","_t":1784253905146,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253905146,"id":"3","progress":0.04000000000000001,"total":60,"current":11} -{"_e":"metro:bundling:progress","_t":1784253905251,"id":"1","progress":0.0749716553287982,"total":84,"current":23} -{"_e":"metro:bundling:progress","_t":1784253905251,"id":"2","progress":0.010000000000000002,"total":3,"current":1} -{"_e":"metro:bundling:progress","_t":1784253905251,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905351,"id":"1","progress":0.0749716553287982,"total":84,"current":23} -{"_e":"metro:bundling:progress","_t":1784253905351,"id":"2","progress":0.06059171597633137,"total":65,"current":16} -{"_e":"metro:bundling:progress","_t":1784253905352,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905451,"id":"1","progress":0.09877551020408162,"total":105,"current":33} -{"_e":"metro:bundling:progress","_t":1784253905451,"id":"2","progress":0.06059171597633137,"total":65,"current":16} -{"_e":"metro:bundling:progress","_t":1784253905451,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905585,"id":"1","progress":0.10485260770975058,"total":105,"current":34} -{"_e":"metro:bundling:progress","_t":1784253905585,"id":"2","progress":0.06059171597633137,"total":65,"current":16} -{"_e":"metro:bundling:progress","_t":1784253905585,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905688,"id":"1","progress":0.10485260770975058,"total":105,"current":34} -{"_e":"metro:bundling:progress","_t":1784253905688,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253905688,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905788,"id":"1","progress":0.19753086419753085,"total":117,"current":52} -{"_e":"metro:bundling:progress","_t":1784253905788,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253905788,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905889,"id":"1","progress":0.24200052029136318,"total":124,"current":61} -{"_e":"metro:bundling:progress","_t":1784253905889,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253905889,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253905990,"id":"1","progress":0.26514813989752734,"total":134,"current":69} -{"_e":"metro:bundling:progress","_t":1784253905990,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253905990,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253906096,"id":"1","progress":0.28444444444444444,"total":135,"current":72} -{"_e":"metro:bundling:progress","_t":1784253906096,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253906096,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253906206,"id":"1","progress":0.28444444444444444,"total":152,"current":79} -{"_e":"metro:bundling:progress","_t":1784253906206,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253906206,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253906307,"id":"1","progress":0.28444444444444444,"total":158,"current":82} -{"_e":"metro:bundling:progress","_t":1784253906307,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253906307,"id":"3","progress":0.07807093425605537,"total":68,"current":19} -{"_e":"metro:bundling:progress","_t":1784253906407,"id":"1","progress":0.28444444444444444,"total":158,"current":82} -{"_e":"metro:bundling:progress","_t":1784253906407,"id":"2","progress":0.0929506246281975,"total":82,"current":25} -{"_e":"metro:bundling:progress","_t":1784253906407,"id":"3","progress":0.07807093425605537,"total":187,"current":43} -{"_e":"metro:bundling:progress","_t":1784253906509,"id":"1","progress":0.28444444444444444,"total":158,"current":82} -{"_e":"metro:bundling:progress","_t":1784253906509,"id":"2","progress":0.0929506246281975,"total":186,"current":32} -{"_e":"metro:bundling:progress","_t":1784253906509,"id":"3","progress":0.07807093425605537,"total":187,"current":43} -{"_e":"metro:bundling:progress","_t":1784253906609,"id":"1","progress":0.28444444444444444,"total":176,"current":89} -{"_e":"metro:bundling:progress","_t":1784253906609,"id":"2","progress":0.0929506246281975,"total":186,"current":32} -{"_e":"metro:bundling:progress","_t":1784253906609,"id":"3","progress":0.07807093425605537,"total":187,"current":43} -{"_e":"metro:bundling:progress","_t":1784253906709,"id":"1","progress":0.28444444444444444,"total":176,"current":89} -{"_e":"metro:bundling:progress","_t":1784253906709,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253906709,"id":"3","progress":0.07807093425605537,"total":187,"current":43} -{"_e":"metro:bundling:progress","_t":1784253906809,"id":"1","progress":0.28444444444444444,"total":176,"current":89} -{"_e":"metro:bundling:progress","_t":1784253906812,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253906812,"id":"3","progress":0.07807093425605537,"total":189,"current":50} -{"_e":"metro:bundling:progress","_t":1784253906909,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253906909,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253906909,"id":"3","progress":0.07807093425605537,"total":189,"current":50} -{"_e":"metro:bundling:progress","_t":1784253907020,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907020,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253907020,"id":"3","progress":0.08906005866067267,"total":191,"current":57} -{"_e":"metro:bundling:progress","_t":1784253907122,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907122,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253907122,"id":"3","progress":0.09765625,"total":192,"current":60} -{"_e":"metro:bundling:progress","_t":1784253907222,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907222,"id":"2","progress":0.0929506246281975,"total":189,"current":47} -{"_e":"metro:bundling:progress","_t":1784253907222,"id":"3","progress":0.1024,"total":200,"current":64} -{"_e":"metro:bundling:progress","_t":1784253907322,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907322,"id":"2","progress":0.0929506246281975,"total":192,"current":51} -{"_e":"metro:bundling:progress","_t":1784253907322,"id":"3","progress":0.1024,"total":200,"current":64} -{"_e":"metro:bundling:progress","_t":1784253907422,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907423,"id":"2","progress":0.0929506246281975,"total":192,"current":55} -{"_e":"metro:bundling:progress","_t":1784253907423,"id":"3","progress":0.1024,"total":200,"current":64} -{"_e":"metro:bundling:progress","_t":1784253907531,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253907531,"id":"2","progress":0.0929506246281975,"total":192,"current":55} -{"_e":"metro:bundling:progress","_t":1784253907531,"id":"3","progress":0.1024,"total":230,"current":72} -{"_e":"metro:bundling:progress","_t":1784253908172,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908172,"id":"2","progress":0.0929506246281975,"total":192,"current":55} -{"_e":"metro:bundling:progress","_t":1784253908172,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908334,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908334,"id":"2","progress":0.09765625,"total":192,"current":60} -{"_e":"metro:bundling:progress","_t":1784253908334,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908435,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908435,"id":"2","progress":0.09765625,"total":211,"current":65} -{"_e":"metro:bundling:progress","_t":1784253908435,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908543,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908543,"id":"2","progress":0.1012396694214876,"total":220,"current":70} -{"_e":"metro:bundling:progress","_t":1784253908543,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908650,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908650,"id":"2","progress":0.10450728299643282,"total":232,"current":75} -{"_e":"metro:bundling:progress","_t":1784253908650,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908843,"id":"1","progress":0.28444444444444444,"total":182,"current":94} -{"_e":"metro:bundling:progress","_t":1784253908843,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253908844,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253908957,"id":"1","progress":0.28444444444444444,"total":188,"current":99} -{"_e":"metro:bundling:progress","_t":1784253908957,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253908957,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253909086,"id":"1","progress":0.2881994459833795,"total":190,"current":102} -{"_e":"metro:bundling:progress","_t":1784253909086,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909087,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253909202,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909202,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909202,"id":"3","progress":0.1024,"total":230,"current":73} -{"_e":"metro:bundling:progress","_t":1784253909302,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909302,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909302,"id":"3","progress":0.1024,"total":1983,"current":81} -{"_e":"metro:bundling:progress","_t":1784253909402,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909402,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909402,"id":"3","progress":0.1024,"total":1997,"current":87} -{"_e":"metro:bundling:progress","_t":1784253909502,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909502,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909502,"id":"3","progress":0.1024,"total":2008,"current":96} -{"_e":"metro:bundling:progress","_t":1784253909606,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909606,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909606,"id":"3","progress":0.1024,"total":2012,"current":97} -{"_e":"metro:bundling:progress","_t":1784253909707,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909707,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909707,"id":"3","progress":0.1024,"total":2025,"current":101} -{"_e":"metro:bundling:progress","_t":1784253909807,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909807,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909807,"id":"3","progress":0.1024,"total":2027,"current":109} -{"_e":"metro:bundling:progress","_t":1784253909907,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253909907,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253909907,"id":"3","progress":0.1024,"total":2041,"current":119} -{"_e":"metro:bundling:progress","_t":1784253910010,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910010,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253910010,"id":"3","progress":0.1024,"total":2055,"current":138} -{"_e":"metro:bundling:progress","_t":1784253910111,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910111,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253910111,"id":"3","progress":0.1024,"total":2070,"current":152} -{"_e":"metro:bundling:progress","_t":1784253910212,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910212,"id":"2","progress":0.10731272294887038,"total":232,"current":76} -{"_e":"metro:bundling:progress","_t":1784253910212,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910313,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910313,"id":"2","progress":0.10731272294887038,"total":1983,"current":85} -{"_e":"metro:bundling:progress","_t":1784253910313,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910413,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910413,"id":"2","progress":0.10731272294887038,"total":1998,"current":96} -{"_e":"metro:bundling:progress","_t":1784253910413,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910514,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910514,"id":"2","progress":0.10731272294887038,"total":2005,"current":99} -{"_e":"metro:bundling:progress","_t":1784253910514,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910620,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910620,"id":"2","progress":0.10731272294887038,"total":2017,"current":103} -{"_e":"metro:bundling:progress","_t":1784253910620,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910720,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910720,"id":"2","progress":0.10731272294887038,"total":2023,"current":112} -{"_e":"metro:bundling:progress","_t":1784253910720,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910822,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910822,"id":"2","progress":0.10731272294887038,"total":2038,"current":125} -{"_e":"metro:bundling:progress","_t":1784253910822,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253910922,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253910922,"id":"2","progress":0.10731272294887038,"total":2051,"current":141} -{"_e":"metro:bundling:progress","_t":1784253910922,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911024,"id":"1","progress":0.28994082840236685,"total":195,"current":105} -{"_e":"metro:bundling:progress","_t":1784253911024,"id":"2","progress":0.10731272294887038,"total":2063,"current":152} -{"_e":"metro:bundling:progress","_t":1784253911024,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911146,"id":"1","progress":0.28994082840236685,"total":198,"current":106} -{"_e":"metro:bundling:progress","_t":1784253911146,"id":"2","progress":0.10731272294887038,"total":2063,"current":152} -{"_e":"metro:bundling:progress","_t":1784253911146,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911251,"id":"1","progress":0.28994082840236685,"total":198,"current":106} -{"_e":"metro:bundling:progress","_t":1784253911252,"id":"2","progress":0.10731272294887038,"total":2064,"current":155} -{"_e":"metro:bundling:progress","_t":1784253911252,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911351,"id":"1","progress":0.28994082840236685,"total":198,"current":106} -{"_e":"metro:bundling:progress","_t":1784253911351,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911351,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911451,"id":"1","progress":0.28994082840236685,"total":1951,"current":118} -{"_e":"metro:bundling:progress","_t":1784253911452,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911452,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911551,"id":"1","progress":0.28994082840236685,"total":1954,"current":126} -{"_e":"metro:bundling:progress","_t":1784253911551,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911551,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911659,"id":"1","progress":0.28994082840236685,"total":1961,"current":131} -{"_e":"metro:bundling:progress","_t":1784253911659,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911659,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911759,"id":"1","progress":0.28994082840236685,"total":1974,"current":143} -{"_e":"metro:bundling:progress","_t":1784253911759,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911759,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911859,"id":"1","progress":0.28994082840236685,"total":1996,"current":150} -{"_e":"metro:bundling:progress","_t":1784253911859,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911859,"id":"3","progress":0.1024,"total":2079,"current":169} -{"_e":"metro:bundling:progress","_t":1784253911959,"id":"1","progress":0.28994082840236685,"total":1996,"current":150} -{"_e":"metro:bundling:progress","_t":1784253911959,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253911959,"id":"3","progress":0.1024,"total":2085,"current":185} -{"_e":"metro:bundling:progress","_t":1784253912059,"id":"1","progress":0.28994082840236685,"total":2004,"current":163} -{"_e":"metro:bundling:progress","_t":1784253912059,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253912059,"id":"3","progress":0.1024,"total":2085,"current":185} -{"_e":"metro:bundling:progress","_t":1784253912159,"id":"1","progress":0.28994082840236685,"total":2011,"current":169} -{"_e":"metro:bundling:progress","_t":1784253912159,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253912159,"id":"3","progress":0.1024,"total":2085,"current":185} -{"_e":"metro:bundling:progress","_t":1784253912259,"id":"1","progress":0.28994082840236685,"total":2011,"current":169} -{"_e":"metro:bundling:progress","_t":1784253912259,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253912259,"id":"3","progress":0.1024,"total":2085,"current":188} -{"_e":"metro:bundling:progress","_t":1784253912360,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912360,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253912360,"id":"3","progress":0.1024,"total":2085,"current":188} -{"_e":"metro:bundling:progress","_t":1784253912461,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912461,"id":"2","progress":0.10731272294887038,"total":2083,"current":179} -{"_e":"metro:bundling:progress","_t":1784253912461,"id":"3","progress":0.1024,"total":2094,"current":203} -{"_e":"metro:bundling:progress","_t":1784253912562,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912563,"id":"2","progress":0.10731272294887038,"total":2085,"current":192} -{"_e":"metro:bundling:progress","_t":1784253912563,"id":"3","progress":0.1024,"total":2094,"current":203} -{"_e":"metro:bundling:progress","_t":1784253912719,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912719,"id":"2","progress":0.10731272294887038,"total":2085,"current":192} -{"_e":"metro:bundling:progress","_t":1784253912719,"id":"3","progress":0.1024,"total":2143,"current":227} -{"_e":"metro:bundling:progress","_t":1784253912820,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912820,"id":"2","progress":0.10731272294887038,"total":2098,"current":199} -{"_e":"metro:bundling:progress","_t":1784253912820,"id":"3","progress":0.1024,"total":2143,"current":227} -{"_e":"metro:bundling:progress","_t":1784253912935,"id":"1","progress":0.28994082840236685,"total":2068,"current":181} -{"_e":"metro:bundling:progress","_t":1784253912935,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253912935,"id":"3","progress":0.1024,"total":2143,"current":227} -{"_e":"metro:bundling:progress","_t":1784253913035,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913035,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913036,"id":"3","progress":0.1024,"total":2143,"current":227} -{"_e":"metro:bundling:progress","_t":1784253913136,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913136,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913136,"id":"3","progress":0.1024,"total":2146,"current":236} -{"_e":"metro:bundling:progress","_t":1784253913237,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913237,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913237,"id":"3","progress":0.1024,"total":2146,"current":259} -{"_e":"metro:bundling:progress","_t":1784253913337,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913337,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913337,"id":"3","progress":0.1024,"total":2146,"current":291} -{"_e":"metro:bundling:progress","_t":1784253913437,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913437,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913437,"id":"3","progress":0.1024,"total":2146,"current":335} -{"_e":"metro:bundling:progress","_t":1784253913538,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913538,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913538,"id":"3","progress":0.1024,"total":2146,"current":375} -{"_e":"metro:bundling:progress","_t":1784253913638,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913638,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913638,"id":"3","progress":0.1024,"total":2146,"current":404} -{"_e":"metro:bundling:progress","_t":1784253913738,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913738,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913738,"id":"3","progress":0.1024,"total":2146,"current":439} -{"_e":"metro:bundling:progress","_t":1784253913838,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913838,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913838,"id":"3","progress":0.1024,"total":2146,"current":465} -{"_e":"metro:bundling:progress","_t":1784253913938,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253913938,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253913938,"id":"3","progress":0.1024,"total":2146,"current":480} -{"_e":"metro:bundling:progress","_t":1784253914038,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914038,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914038,"id":"3","progress":0.1024,"total":2146,"current":505} -{"_e":"metro:bundling:progress","_t":1784253914138,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914138,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914138,"id":"3","progress":0.1024,"total":2146,"current":553} -{"_e":"metro:bundling:progress","_t":1784253914238,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914238,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914238,"id":"3","progress":0.1024,"total":2146,"current":596} -{"_e":"metro:bundling:progress","_t":1784253914338,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914338,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914338,"id":"3","progress":0.1024,"total":2146,"current":640} -{"_e":"metro:bundling:progress","_t":1784253914439,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914439,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914439,"id":"3","progress":0.1024,"total":2146,"current":683} -{"_e":"metro:bundling:progress","_t":1784253914538,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914539,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914539,"id":"3","progress":0.11444947534544862,"total":2146,"current":726} -{"_e":"metro:bundling:progress","_t":1784253914638,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914638,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914638,"id":"3","progress":0.12874252277151013,"total":2146,"current":770} -{"_e":"metro:bundling:progress","_t":1784253914738,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914738,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914738,"id":"3","progress":0.14458421528511833,"total":2146,"current":816} -{"_e":"metro:bundling:progress","_t":1784253914838,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914838,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914838,"id":"3","progress":0.16059701440682897,"total":2146,"current":860} -{"_e":"metro:bundling:progress","_t":1784253914938,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253914938,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253914938,"id":"3","progress":0.17784338794558288,"total":2146,"current":905} -{"_e":"metro:bundling:progress","_t":1784253915038,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915038,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915038,"id":"3","progress":0.19555683041076877,"total":2146,"current":949} -{"_e":"metro:bundling:progress","_t":1784253915138,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915138,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915138,"id":"3","progress":0.2106750112261569,"total":2146,"current":985} -{"_e":"metro:bundling:progress","_t":1784253915239,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915239,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915239,"id":"3","progress":0.21324942740085587,"total":2146,"current":991} -{"_e":"metro:bundling:progress","_t":1784253915339,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915339,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915340,"id":"3","progress":0.21714036561226202,"total":2146,"current":1000} -{"_e":"metro:bundling:progress","_t":1784253915440,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915440,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915440,"id":"3","progress":0.2267996376361579,"total":2146,"current":1022} -{"_e":"metro:bundling:progress","_t":1784253915540,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915540,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915541,"id":"3","progress":0.24674875730568757,"total":2146,"current":1066} -{"_e":"metro:bundling:progress","_t":1784253915651,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915651,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915651,"id":"3","progress":0.2504662003649695,"total":2146,"current":1074} -{"_e":"metro:bundling:progress","_t":1784253915759,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915759,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915759,"id":"3","progress":0.25798446838392847,"total":2146,"current":1090} -{"_e":"metro:bundling:progress","_t":1784253915859,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915860,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915860,"id":"3","progress":0.26995433103830446,"total":2146,"current":1115} -{"_e":"metro:bundling:progress","_t":1784253915959,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253915959,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253915959,"id":"3","progress":0.2926880587564458,"total":2146,"current":1161} -{"_e":"metro:bundling:progress","_t":1784253916059,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916061,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916061,"id":"3","progress":0.3158167647996359,"total":2146,"current":1206} -{"_e":"metro:bundling:progress","_t":1784253916159,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916159,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916159,"id":"3","progress":0.3414566991711318,"total":2146,"current":1254} -{"_e":"metro:bundling:progress","_t":1784253916259,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916260,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916260,"id":"3","progress":0.3669672178847228,"total":2146,"current":1300} -{"_e":"metro:bundling:progress","_t":1784253916360,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916360,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916360,"id":"3","progress":0.39281234990172226,"total":2146,"current":1345} -{"_e":"metro:bundling:progress","_t":1784253916460,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916461,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916461,"id":"3","progress":0.41652407782658124,"total":2146,"current":1385} -{"_e":"metro:bundling:progress","_t":1784253916561,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916561,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916561,"id":"3","progress":0.43969382339887203,"total":2146,"current":1423} -{"_e":"metro:bundling:progress","_t":1784253916663,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916663,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916663,"id":"3","progress":0.46032367811459624,"total":2146,"current":1456} -{"_e":"metro:bundling:progress","_t":1784253916763,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916763,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916763,"id":"3","progress":0.4833683508362944,"total":2146,"current":1492} -{"_e":"metro:bundling:progress","_t":1784253916864,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916864,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916864,"id":"3","progress":0.5143015159003204,"total":2146,"current":1539} -{"_e":"metro:bundling:progress","_t":1784253916966,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253916966,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253916966,"id":"3","progress":0.5441296536437455,"total":2146,"current":1583} -{"_e":"metro:bundling:progress","_t":1784253917066,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917066,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917066,"id":"3","progress":0.571975734129862,"total":2146,"current":1623} -{"_e":"metro:bundling:progress","_t":1784253917166,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917166,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917166,"id":"3","progress":0.6063082316175481,"total":2146,"current":1671} -{"_e":"metro:bundling:progress","_t":1784253917266,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917267,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917267,"id":"3","progress":0.6416413119099754,"total":2146,"current":1719} -{"_e":"metro:bundling:progress","_t":1784253917368,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917368,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917368,"id":"3","progress":0.6764410954644589,"total":2146,"current":1765} -{"_e":"metro:bundling:progress","_t":1784253917467,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917467,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917467,"id":"3","progress":0.7145212185222469,"total":2146,"current":1814} -{"_e":"metro:bundling:progress","_t":1784253917567,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917568,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917568,"id":"3","progress":0.75526304818171,"total":2146,"current":1865} -{"_e":"metro:bundling:progress","_t":1784253917667,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917667,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917667,"id":"3","progress":0.7921497677900929,"total":2146,"current":1910} -{"_e":"metro:bundling:progress","_t":1784253917767,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917767,"id":"2","progress":0.10731272294887038,"total":2119,"current":214} -{"_e":"metro:bundling:progress","_t":1784253917767,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253917867,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917867,"id":"2","progress":0.10731272294887038,"total":2147,"current":256} -{"_e":"metro:bundling:progress","_t":1784253917867,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253917967,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253917967,"id":"2","progress":0.10731272294887038,"total":2147,"current":309} -{"_e":"metro:bundling:progress","_t":1784253917967,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918068,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918068,"id":"2","progress":0.10731272294887038,"total":2147,"current":361} -{"_e":"metro:bundling:progress","_t":1784253918068,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918168,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918168,"id":"2","progress":0.10731272294887038,"total":2147,"current":407} -{"_e":"metro:bundling:progress","_t":1784253918168,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918268,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918268,"id":"2","progress":0.10731272294887038,"total":2147,"current":453} -{"_e":"metro:bundling:progress","_t":1784253918268,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918368,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918368,"id":"2","progress":0.10731272294887038,"total":2147,"current":500} -{"_e":"metro:bundling:progress","_t":1784253918368,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918469,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918469,"id":"2","progress":0.10731272294887038,"total":2147,"current":551} -{"_e":"metro:bundling:progress","_t":1784253918469,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918569,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918569,"id":"2","progress":0.10731272294887038,"total":2147,"current":606} -{"_e":"metro:bundling:progress","_t":1784253918569,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918669,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918669,"id":"2","progress":0.10731272294887038,"total":2147,"current":658} -{"_e":"metro:bundling:progress","_t":1784253918669,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918769,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918769,"id":"2","progress":0.10997548815962482,"total":2147,"current":712} -{"_e":"metro:bundling:progress","_t":1784253918769,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918870,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918870,"id":"2","progress":0.12662592423782582,"total":2147,"current":764} -{"_e":"metro:bundling:progress","_t":1784253918870,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253918970,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253918970,"id":"2","progress":0.14444956177411142,"total":2147,"current":816} -{"_e":"metro:bundling:progress","_t":1784253918970,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919070,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919070,"id":"2","progress":0.16269405930090816,"total":2147,"current":866} -{"_e":"metro:bundling:progress","_t":1784253919070,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919171,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919171,"id":"2","progress":0.1812292539345528,"total":2147,"current":914} -{"_e":"metro:bundling:progress","_t":1784253919171,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919273,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919274,"id":"2","progress":0.20495968313147603,"total":2147,"current":972} -{"_e":"metro:bundling:progress","_t":1784253919274,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919373,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919373,"id":"2","progress":0.22481820041569686,"total":2147,"current":1018} -{"_e":"metro:bundling:progress","_t":1784253919373,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919474,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919474,"id":"2","progress":0.24976717114184738,"total":2147,"current":1073} -{"_e":"metro:bundling:progress","_t":1784253919474,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919574,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919574,"id":"2","progress":0.2706713302581629,"total":2147,"current":1117} -{"_e":"metro:bundling:progress","_t":1784253919574,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919674,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919674,"id":"2","progress":0.296459200769523,"total":2147,"current":1169} -{"_e":"metro:bundling:progress","_t":1784253919674,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919774,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919774,"id":"2","progress":0.3250115139917507,"total":2147,"current":1224} -{"_e":"metro:bundling:progress","_t":1784253919774,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919875,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919875,"id":"2","progress":0.3526600629250767,"total":2147,"current":1275} -{"_e":"metro:bundling:progress","_t":1784253919875,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253919975,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253919975,"id":"2","progress":0.3820126609436939,"total":2147,"current":1327} -{"_e":"metro:bundling:progress","_t":1784253919975,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920075,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920075,"id":"2","progress":0.41014866987633875,"total":2147,"current":1375} -{"_e":"metro:bundling:progress","_t":1784253920075,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920176,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920176,"id":"2","progress":0.44423746135518216,"total":2147,"current":1431} -{"_e":"metro:bundling:progress","_t":1784253920176,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920276,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920276,"id":"2","progress":0.48162436336791253,"total":2147,"current":1490} -{"_e":"metro:bundling:progress","_t":1784253920276,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920376,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920376,"id":"2","progress":0.5164969523445481,"total":2147,"current":1543} -{"_e":"metro:bundling:progress","_t":1784253920376,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920476,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920476,"id":"2","progress":0.553974100623285,"total":2147,"current":1598} -{"_e":"metro:bundling:progress","_t":1784253920476,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920576,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920576,"id":"2","progress":0.5906140846219278,"total":2147,"current":1650} -{"_e":"metro:bundling:progress","_t":1784253920576,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920677,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920677,"id":"2","progress":0.6306445948018584,"total":2147,"current":1705} -{"_e":"metro:bundling:progress","_t":1784253920677,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920778,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920781,"id":"2","progress":0.6689365627323272,"total":2147,"current":1756} -{"_e":"metro:bundling:progress","_t":1784253920781,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920878,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920878,"id":"2","progress":0.7067898817448508,"total":2147,"current":1805} -{"_e":"metro:bundling:progress","_t":1784253920878,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253920978,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253920978,"id":"2","progress":0.7456849377029592,"total":2147,"current":1854} -{"_e":"metro:bundling:progress","_t":1784253920978,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253921078,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253921078,"id":"2","progress":0.784796280986088,"total":2147,"current":1902} -{"_e":"metro:bundling:progress","_t":1784253921078,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253921179,"id":"1","progress":0.28994082840236685,"total":2074,"current":185} -{"_e":"metro:bundling:progress","_t":1784253921179,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921179,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253921279,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921279,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921279,"id":"3","progress":0.8282187367815802,"total":2146,"current":1953} -{"_e":"metro:bundling:progress","_t":1784253921380,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921380,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921380,"id":"3","progress":0.8409819703115378,"total":2170,"current":1990} -{"_e":"metro:bundling:progress","_t":1784253921481,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921481,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921481,"id":"3","progress":0.8436205005955522,"total":2196,"current":2017} -{"_e":"metro:bundling:progress","_t":1784253921581,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921581,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921581,"id":"3","progress":0.8436205005955522,"total":2224,"current":2032} -{"_e":"metro:bundling:progress","_t":1784253921682,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921682,"id":"2","progress":0.8316896292071627,"total":2147,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253921682,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253921782,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921782,"id":"2","progress":0.8385193967378285,"total":2171,"current":1988} -{"_e":"metro:bundling:progress","_t":1784253921782,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253921882,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921882,"id":"2","progress":0.8458628589695775,"total":2192,"current":2016} -{"_e":"metro:bundling:progress","_t":1784253921882,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253921982,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253921982,"id":"2","progress":0.8458628589695775,"total":2232,"current":2036} -{"_e":"metro:bundling:progress","_t":1784253921982,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922085,"id":"1","progress":0.28994082840236685,"total":2076,"current":190} -{"_e":"metro:bundling:progress","_t":1784253922085,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922085,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922186,"id":"1","progress":0.28994082840236685,"total":2086,"current":222} -{"_e":"metro:bundling:progress","_t":1784253922186,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922186,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922286,"id":"1","progress":0.28994082840236685,"total":2086,"current":246} -{"_e":"metro:bundling:progress","_t":1784253922286,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922286,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922386,"id":"1","progress":0.28994082840236685,"total":2086,"current":276} -{"_e":"metro:bundling:progress","_t":1784253922386,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922386,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922486,"id":"1","progress":0.28994082840236685,"total":2086,"current":302} -{"_e":"metro:bundling:progress","_t":1784253922486,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922486,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922586,"id":"1","progress":0.28994082840236685,"total":2086,"current":327} -{"_e":"metro:bundling:progress","_t":1784253922586,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922586,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922687,"id":"1","progress":0.28994082840236685,"total":2086,"current":352} -{"_e":"metro:bundling:progress","_t":1784253922687,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922687,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922786,"id":"1","progress":0.28994082840236685,"total":2086,"current":372} -{"_e":"metro:bundling:progress","_t":1784253922786,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922786,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922886,"id":"1","progress":0.28994082840236685,"total":2086,"current":396} -{"_e":"metro:bundling:progress","_t":1784253922886,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922886,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922986,"id":"1","progress":0.28994082840236685,"total":2086,"current":421} -{"_e":"metro:bundling:progress","_t":1784253922986,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253922986,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923086,"id":"1","progress":0.28994082840236685,"total":2086,"current":447} -{"_e":"metro:bundling:progress","_t":1784253923086,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923086,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923186,"id":"1","progress":0.28994082840236685,"total":2086,"current":473} -{"_e":"metro:bundling:progress","_t":1784253923186,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923186,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923286,"id":"1","progress":0.28994082840236685,"total":2086,"current":496} -{"_e":"metro:bundling:progress","_t":1784253923288,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923288,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923386,"id":"1","progress":0.28994082840236685,"total":2086,"current":514} -{"_e":"metro:bundling:progress","_t":1784253923386,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923386,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923487,"id":"1","progress":0.28994082840236685,"total":2086,"current":537} -{"_e":"metro:bundling:progress","_t":1784253923487,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923487,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923590,"id":"1","progress":0.28994082840236685,"total":2086,"current":557} -{"_e":"metro:bundling:progress","_t":1784253923590,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923590,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923692,"id":"1","progress":0.28994082840236685,"total":2086,"current":586} -{"_e":"metro:bundling:progress","_t":1784253923692,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923692,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923794,"id":"1","progress":0.28994082840236685,"total":2086,"current":612} -{"_e":"metro:bundling:progress","_t":1784253923794,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923794,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923893,"id":"1","progress":0.28994082840236685,"total":2086,"current":642} -{"_e":"metro:bundling:progress","_t":1784253923895,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923895,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923993,"id":"1","progress":0.28994082840236685,"total":2086,"current":667} -{"_e":"metro:bundling:progress","_t":1784253923993,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253923993,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924093,"id":"1","progress":0.28994082840236685,"total":2086,"current":693} -{"_e":"metro:bundling:progress","_t":1784253924093,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924093,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924193,"id":"1","progress":0.28994082840236685,"total":2086,"current":715} -{"_e":"metro:bundling:progress","_t":1784253924193,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924193,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924293,"id":"1","progress":0.28994082840236685,"total":2086,"current":737} -{"_e":"metro:bundling:progress","_t":1784253924294,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924294,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924393,"id":"1","progress":0.28994082840236685,"total":2086,"current":758} -{"_e":"metro:bundling:progress","_t":1784253924393,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924393,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924494,"id":"1","progress":0.28994082840236685,"total":2086,"current":788} -{"_e":"metro:bundling:progress","_t":1784253924494,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924494,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924594,"id":"1","progress":0.28994082840236685,"total":2086,"current":813} -{"_e":"metro:bundling:progress","_t":1784253924594,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924594,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924695,"id":"1","progress":0.28994082840236685,"total":2086,"current":843} -{"_e":"metro:bundling:progress","_t":1784253924695,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924695,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924795,"id":"1","progress":0.28994082840236685,"total":2086,"current":871} -{"_e":"metro:bundling:progress","_t":1784253924795,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924795,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924898,"id":"1","progress":0.28994082840236685,"total":2086,"current":898} -{"_e":"metro:bundling:progress","_t":1784253924898,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924898,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924999,"id":"1","progress":0.28994082840236685,"total":2086,"current":925} -{"_e":"metro:bundling:progress","_t":1784253924999,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253924999,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925101,"id":"1","progress":0.28994082840236685,"total":2086,"current":952} -{"_e":"metro:bundling:progress","_t":1784253925101,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925101,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925201,"id":"1","progress":0.28994082840236685,"total":2086,"current":980} -{"_e":"metro:bundling:progress","_t":1784253925202,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925202,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925301,"id":"1","progress":0.28994082840236685,"total":2086,"current":1010} -{"_e":"metro:bundling:progress","_t":1784253925301,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925302,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925401,"id":"1","progress":0.28994082840236685,"total":2086,"current":1037} -{"_e":"metro:bundling:progress","_t":1784253925401,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925401,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925501,"id":"1","progress":0.28994082840236685,"total":2086,"current":1059} -{"_e":"metro:bundling:progress","_t":1784253925502,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925502,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925602,"id":"1","progress":0.28994082840236685,"total":2086,"current":1084} -{"_e":"metro:bundling:progress","_t":1784253925602,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925602,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925702,"id":"1","progress":0.28994082840236685,"total":2086,"current":1111} -{"_e":"metro:bundling:progress","_t":1784253925702,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925702,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925802,"id":"1","progress":0.2970929329346261,"total":2086,"current":1137} -{"_e":"metro:bundling:progress","_t":1784253925802,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925802,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925902,"id":"1","progress":0.3124413406640076,"total":2086,"current":1166} -{"_e":"metro:bundling:progress","_t":1784253925902,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253925902,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926002,"id":"1","progress":0.3276272717996707,"total":2086,"current":1194} -{"_e":"metro:bundling:progress","_t":1784253926002,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926004,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926102,"id":"1","progress":0.34429778397553334,"total":2086,"current":1224} -{"_e":"metro:bundling:progress","_t":1784253926102,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926102,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926203,"id":"1","progress":0.36080581955767754,"total":2086,"current":1253} -{"_e":"metro:bundling:progress","_t":1784253926203,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926203,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926303,"id":"1","progress":0.37711139137876665,"total":2086,"current":1281} -{"_e":"metro:bundling:progress","_t":1784253926303,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926303,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926404,"id":"1","progress":0.3925749345727211,"total":2086,"current":1307} -{"_e":"metro:bundling:progress","_t":1784253926404,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926404,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926506,"id":"1","progress":0.40957545578476423,"total":2086,"current":1335} -{"_e":"metro:bundling:progress","_t":1784253926506,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926506,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926608,"id":"1","progress":0.42756301655836426,"total":2086,"current":1364} -{"_e":"metro:bundling:progress","_t":1784253926608,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926608,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926708,"id":"1","progress":0.4459371199495518,"total":2086,"current":1393} -{"_e":"metro:bundling:progress","_t":1784253926708,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926708,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926808,"id":"1","progress":0.4633915184919965,"total":2086,"current":1420} -{"_e":"metro:bundling:progress","_t":1784253926810,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926810,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926909,"id":"1","progress":0.48317827198443897,"total":2086,"current":1450} -{"_e":"metro:bundling:progress","_t":1784253926909,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253926909,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927010,"id":"1","progress":0.4979514620135699,"total":2086,"current":1472} -{"_e":"metro:bundling:progress","_t":1784253927010,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927010,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927114,"id":"1","progress":0.5143213810004881,"total":2086,"current":1496} -{"_e":"metro:bundling:progress","_t":1784253927114,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927114,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927215,"id":"1","progress":0.5337542250808707,"total":2086,"current":1524} -{"_e":"metro:bundling:progress","_t":1784253927215,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927215,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927316,"id":"1","progress":0.5478554468497006,"total":2086,"current":1544} -{"_e":"metro:bundling:progress","_t":1784253927316,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927316,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927417,"id":"1","progress":0.565019593711995,"total":2086,"current":1568} -{"_e":"metro:bundling:progress","_t":1784253927417,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927417,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927518,"id":"1","progress":0.5853790369803162,"total":2086,"current":1596} -{"_e":"metro:bundling:progress","_t":1784253927519,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927519,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927618,"id":"1","progress":0.6060988243772802,"total":2086,"current":1624} -{"_e":"metro:bundling:progress","_t":1784253927618,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927618,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927721,"id":"1","progress":0.625661282034547,"total":2086,"current":1650} -{"_e":"metro:bundling:progress","_t":1784253927721,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927721,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927822,"id":"1","progress":0.6470760188224653,"total":2086,"current":1678} -{"_e":"metro:bundling:progress","_t":1784253927822,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927822,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927922,"id":"1","progress":0.6704202513400298,"total":2086,"current":1708} -{"_e":"metro:bundling:progress","_t":1784253927922,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253927922,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928022,"id":"1","progress":0.6870073420116211,"total":2086,"current":1729} -{"_e":"metro:bundling:progress","_t":1784253928022,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928022,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928122,"id":"1","progress":0.7102465507621002,"total":2086,"current":1758} -{"_e":"metro:bundling:progress","_t":1784253928122,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928122,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928222,"id":"1","progress":0.7314103336032851,"total":2086,"current":1784} -{"_e":"metro:bundling:progress","_t":1784253928222,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928222,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928322,"id":"1","progress":0.7537169680718556,"total":2086,"current":1811} -{"_e":"metro:bundling:progress","_t":1784253928322,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928322,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928422,"id":"1","progress":0.7738263766386695,"total":2086,"current":1835} -{"_e":"metro:bundling:progress","_t":1784253928422,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928422,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928522,"id":"1","progress":0.7942005278306089,"total":2086,"current":1859} -{"_e":"metro:bundling:progress","_t":1784253928522,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928522,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928622,"id":"1","progress":0.8148394216476735,"total":2086,"current":1883} -{"_e":"metro:bundling:progress","_t":1784253928622,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928622,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928722,"id":"1","progress":0.8401313049881003,"total":2086,"current":1912} -{"_e":"metro:bundling:progress","_t":1784253928722,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928722,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928822,"id":"1","progress":0.8667020882493801,"total":2086,"current":1942} -{"_e":"metro:bundling:progress","_t":1784253928822,"id":"2","progress":0.8458628589695775,"total":2264,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928822,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253928922,"id":"1","progress":0.8667020882493801,"total":2086,"current":1942} -{"_e":"metro:bundling:progress","_t":1784253928922,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253928922,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929022,"id":"1","progress":0.8768338539997772,"total":2091,"current":1958} -{"_e":"metro:bundling:progress","_t":1784253929022,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929022,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929130,"id":"1","progress":0.8809163265306124,"total":2100,"current":1971} -{"_e":"metro:bundling:progress","_t":1784253929130,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929130,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929235,"id":"1","progress":0.8809163265306124,"total":2134,"current":1978} -{"_e":"metro:bundling:progress","_t":1784253929235,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929235,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929335,"id":"1","progress":0.8809163265306124,"total":2174,"current":1983} -{"_e":"metro:bundling:progress","_t":1784253929335,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929335,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929532,"id":"1","progress":0.8809163265306124,"total":2174,"current":1984} -{"_e":"metro:bundling:progress","_t":1784253929532,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929532,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929633,"id":"1","progress":0.8809163265306124,"total":2174,"current":1990} -{"_e":"metro:bundling:progress","_t":1784253929633,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929633,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929735,"id":"1","progress":0.8809163265306124,"total":2174,"current":1992} -{"_e":"metro:bundling:progress","_t":1784253929735,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929735,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929799,"id":"1","progress":0.8809163265306124,"total":2174,"current":1993} -{"_e":"metro:bundling:progress","_t":1784253929799,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929799,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929899,"id":"1","progress":0.8809163265306124,"total":2182,"current":1995} -{"_e":"metro:bundling:progress","_t":1784253929899,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929899,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253929963,"id":"1","progress":0.8809163265306124,"total":2182,"current":1996} -{"_e":"metro:bundling:progress","_t":1784253929964,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253929964,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930063,"id":"1","progress":0.8809163265306124,"total":2195,"current":2003} -{"_e":"metro:bundling:progress","_t":1784253930063,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930063,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930164,"id":"1","progress":0.8809163265306124,"total":2198,"current":2010} -{"_e":"metro:bundling:progress","_t":1784253930164,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930164,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930264,"id":"1","progress":0.8809163265306124,"total":2205,"current":2025} -{"_e":"metro:bundling:progress","_t":1784253930264,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930264,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930364,"id":"1","progress":0.8809163265306124,"total":2210,"current":2037} -{"_e":"metro:bundling:progress","_t":1784253930364,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930364,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930470,"id":"1","progress":0.8809163265306124,"total":2213,"current":2048} -{"_e":"metro:bundling:progress","_t":1784253930470,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930470,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930570,"id":"1","progress":0.8809163265306124,"total":2215,"current":2065} -{"_e":"metro:bundling:progress","_t":1784253930570,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930570,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930822,"id":"1","progress":0.8809163265306124,"total":2215,"current":2066} -{"_e":"metro:bundling:progress","_t":1784253930822,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930822,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253930922,"id":"1","progress":0.8809163265306124,"total":2228,"current":2068} -{"_e":"metro:bundling:progress","_t":1784253930923,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253930923,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253931117,"id":"1","progress":0.8809163265306124,"total":2228,"current":2069} -{"_e":"metro:bundling:progress","_t":1784253931117,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253931117,"id":"3","progress":0.8436205005955522,"total":2255,"current":2062} -{"_e":"metro:bundling:progress","_t":1784253931217,"id":"1","progress":0.8809163265306124,"total":2228,"current":2069} -{"_e":"metro:bundling:progress","_t":1784253931217,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253931217,"id":"3","progress":0.8493995003695853,"total":2284,"current":2105} -{"_e":"metro:bundling:progress","_t":1784253931908,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253931908,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253931908,"id":"3","progress":0.8493995003695853,"total":2284,"current":2105} -{"_e":"metro:bundling:progress","_t":1784253932009,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932009,"id":"2","progress":0.8458628589695775,"total":2277,"current":2080} -{"_e":"metro:bundling:progress","_t":1784253932009,"id":"3","progress":0.8493995003695853,"total":2308,"current":2117} -{"_e":"metro:bundling:progress","_t":1784253932109,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932109,"id":"2","progress":0.8458628589695775,"total":2284,"current":2087} -{"_e":"metro:bundling:progress","_t":1784253932109,"id":"3","progress":0.8493995003695853,"total":2308,"current":2117} -{"_e":"metro:bundling:progress","_t":1784253932209,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932209,"id":"2","progress":0.8458628589695775,"total":2374,"current":2108} -{"_e":"metro:bundling:progress","_t":1784253932209,"id":"3","progress":0.8493995003695853,"total":2308,"current":2117} -{"_e":"metro:bundling:progress","_t":1784253932310,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932310,"id":"2","progress":0.8458628589695775,"total":2378,"current":2137} -{"_e":"metro:bundling:progress","_t":1784253932310,"id":"3","progress":0.8493995003695853,"total":2308,"current":2117} -{"_e":"metro:bundling:progress","_t":1784253932410,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932410,"id":"2","progress":0.8458628589695775,"total":2383,"current":2147} -{"_e":"metro:bundling:progress","_t":1784253932410,"id":"3","progress":0.8493995003695853,"total":2308,"current":2117} -{"_e":"metro:bundling:progress","_t":1784253932511,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932511,"id":"2","progress":0.8458628589695775,"total":2383,"current":2147} -{"_e":"metro:bundling:progress","_t":1784253932511,"id":"3","progress":0.8493995003695853,"total":2385,"current":2155} -{"_e":"metro:bundling:progress","_t":1784253932611,"id":"1","progress":0.8809163265306124,"total":2228,"current":2072} -{"_e":"metro:bundling:progress","_t":1784253932611,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253932611,"id":"3","progress":0.8493995003695853,"total":2385,"current":2155} -{"_e":"metro:bundling:progress","_t":1784253932711,"id":"1","progress":0.8809163265306124,"total":2229,"current":2076} -{"_e":"metro:bundling:progress","_t":1784253932711,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253932711,"id":"3","progress":0.8493995003695853,"total":2385,"current":2155} -{"_e":"metro:bundling:progress","_t":1784253932811,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253932811,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253932811,"id":"3","progress":0.8493995003695853,"total":2385,"current":2155} -{"_e":"metro:bundling:progress","_t":1784253932919,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253932919,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253932919,"id":"3","progress":0.8493995003695853,"total":2390,"current":2162} -{"_e":"metro:bundling:progress","_t":1784253933026,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933026,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933026,"id":"3","progress":0.8493995003695853,"total":2390,"current":2163} -{"_e":"metro:bundling:progress","_t":1784253933168,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933168,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933168,"id":"3","progress":0.8493995003695853,"total":2390,"current":2164} -{"_e":"metro:bundling:progress","_t":1784253933269,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933269,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933269,"id":"3","progress":0.8493995003695853,"total":2399,"current":2170} -{"_e":"metro:bundling:progress","_t":1784253933381,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933381,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933381,"id":"3","progress":0.8493995003695853,"total":2409,"current":2180} -{"_e":"metro:bundling:progress","_t":1784253933482,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933482,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933482,"id":"3","progress":0.8493995003695853,"total":2419,"current":2196} -{"_e":"metro:bundling:progress","_t":1784253933582,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933582,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933582,"id":"3","progress":0.8493995003695853,"total":2423,"current":2204} -{"_e":"metro:bundling:progress","_t":1784253933684,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933684,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933684,"id":"3","progress":0.8493995003695853,"total":2426,"current":2216} -{"_e":"metro:bundling:progress","_t":1784253933786,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933786,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933786,"id":"3","progress":0.8493995003695853,"total":2433,"current":2238} -{"_e":"metro:bundling:progress","_t":1784253933887,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933887,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933887,"id":"3","progress":0.8600145917582664,"total":2437,"current":2260} -{"_e":"metro:bundling:progress","_t":1784253933988,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253933988,"id":"2","progress":0.8458628589695775,"total":2387,"current":2157} -{"_e":"metro:bundling:progress","_t":1784253933988,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934088,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934088,"id":"2","progress":0.8458628589695775,"total":2396,"current":2167} -{"_e":"metro:bundling:progress","_t":1784253934088,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934188,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934188,"id":"2","progress":0.8458628589695775,"total":2406,"current":2181} -{"_e":"metro:bundling:progress","_t":1784253934188,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934288,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934288,"id":"2","progress":0.8458628589695775,"total":2416,"current":2195} -{"_e":"metro:bundling:progress","_t":1784253934288,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934389,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934389,"id":"2","progress":0.8458628589695775,"total":2419,"current":2207} -{"_e":"metro:bundling:progress","_t":1784253934389,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934488,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934488,"id":"2","progress":0.8458628589695775,"total":2428,"current":2230} -{"_e":"metro:bundling:progress","_t":1784253934488,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934588,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934588,"id":"2","progress":0.8546953183288212,"total":2437,"current":2253} -{"_e":"metro:bundling:progress","_t":1784253934588,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934689,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934689,"id":"2","progress":0.8638241755429267,"total":2437,"current":2265} -{"_e":"metro:bundling:progress","_t":1784253934689,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934789,"id":"1","progress":0.8809163265306124,"total":2230,"current":2078} -{"_e":"metro:bundling:progress","_t":1784253934789,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253934789,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934892,"id":"1","progress":0.8809163265306124,"total":2251,"current":2098} -{"_e":"metro:bundling:progress","_t":1784253934892,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253934892,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253934997,"id":"1","progress":0.8809163265306124,"total":2301,"current":2109} -{"_e":"metro:bundling:progress","_t":1784253934997,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253934997,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935103,"id":"1","progress":0.8809163265306124,"total":2303,"current":2120} -{"_e":"metro:bundling:progress","_t":1784253935103,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935103,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935204,"id":"1","progress":0.8809163265306124,"total":2304,"current":2130} -{"_e":"metro:bundling:progress","_t":1784253935204,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935204,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935304,"id":"1","progress":0.8809163265306124,"total":2309,"current":2133} -{"_e":"metro:bundling:progress","_t":1784253935304,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935304,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935413,"id":"1","progress":0.8809163265306124,"total":2321,"current":2138} -{"_e":"metro:bundling:progress","_t":1784253935413,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935413,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935514,"id":"1","progress":0.8809163265306124,"total":2346,"current":2163} -{"_e":"metro:bundling:progress","_t":1784253935514,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935514,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935615,"id":"1","progress":0.8809163265306124,"total":2352,"current":2169} -{"_e":"metro:bundling:progress","_t":1784253935615,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935615,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935715,"id":"1","progress":0.8809163265306124,"total":2356,"current":2174} -{"_e":"metro:bundling:progress","_t":1784253935715,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935715,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935833,"id":"1","progress":0.8809163265306124,"total":2357,"current":2178} -{"_e":"metro:bundling:progress","_t":1784253935834,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935834,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253935942,"id":"1","progress":0.8809163265306124,"total":2358,"current":2182} -{"_e":"metro:bundling:progress","_t":1784253935942,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253935942,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936043,"id":"1","progress":0.8809163265306124,"total":2361,"current":2190} -{"_e":"metro:bundling:progress","_t":1784253936043,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253936043,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936160,"id":"1","progress":0.8809163265306124,"total":2363,"current":2194} -{"_e":"metro:bundling:progress","_t":1784253936162,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253936162,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936260,"id":"1","progress":0.8809163265306124,"total":2413,"current":2208} -{"_e":"metro:bundling:progress","_t":1784253936260,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253936260,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936361,"id":"1","progress":0.8809163265306124,"total":2418,"current":2219} -{"_e":"metro:bundling:progress","_t":1784253936361,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253936361,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936461,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936461,"id":"2","progress":0.8702453600712705,"total":2443,"current":2279} -{"_e":"metro:bundling:progress","_t":1784253936461,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936561,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936562,"id":"2","progress":0.8702453600712705,"total":2483,"current":2294} -{"_e":"metro:bundling:progress","_t":1784253936562,"id":"3","progress":0.8685108950310496,"total":2439,"current":2273} -{"_e":"metro:bundling:progress","_t":1784253936666,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936666,"id":"2","progress":0.8702453600712705,"total":2483,"current":2294} -{"_e":"metro:bundling:progress","_t":1784253936666,"id":"3","progress":0.8685108950310496,"total":2505,"current":2313} -{"_e":"metro:bundling:progress","_t":1784253936766,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936766,"id":"2","progress":0.8702453600712705,"total":2483,"current":2294} -{"_e":"metro:bundling:progress","_t":1784253936766,"id":"3","progress":0.8685108950310496,"total":2505,"current":2322} -{"_e":"metro:bundling:progress","_t":1784253936866,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936866,"id":"2","progress":0.8702453600712705,"total":2483,"current":2294} -{"_e":"metro:bundling:progress","_t":1784253936866,"id":"3","progress":0.8685108950310496,"total":2534,"current":2343} -{"_e":"metro:bundling:progress","_t":1784253936966,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253936966,"id":"2","progress":0.8702453600712705,"total":2483,"current":2294} -{"_e":"metro:bundling:progress","_t":1784253936966,"id":"3","progress":0.8685108950310496,"total":2548,"current":2370} -{"_e":"metro:bundling:progress","_t":1784253937067,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937068,"id":"2","progress":0.8702453600712705,"total":2502,"current":2312} -{"_e":"metro:bundling:progress","_t":1784253937068,"id":"3","progress":0.8685108950310496,"total":2548,"current":2370} -{"_e":"metro:bundling:progress","_t":1784253937182,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937182,"id":"2","progress":0.8702453600712705,"total":2503,"current":2324} -{"_e":"metro:bundling:progress","_t":1784253937182,"id":"3","progress":0.8685108950310496,"total":2548,"current":2370} -{"_e":"metro:bundling:progress","_t":1784253937286,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937286,"id":"2","progress":0.8702453600712705,"total":2524,"current":2338} -{"_e":"metro:bundling:progress","_t":1784253937286,"id":"3","progress":0.8685108950310496,"total":2548,"current":2370} -{"_e":"metro:bundling:progress","_t":1784253937387,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937387,"id":"2","progress":0.8702453600712705,"total":2546,"current":2362} -{"_e":"metro:bundling:progress","_t":1784253937387,"id":"3","progress":0.8685108950310496,"total":2548,"current":2370} -{"_e":"metro:bundling:progress","_t":1784253937490,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937490,"id":"2","progress":0.8702453600712705,"total":2546,"current":2362} -{"_e":"metro:bundling:progress","_t":1784253937490,"id":"3","progress":0.8695983209286298,"total":2549,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253937591,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937591,"id":"2","progress":0.8702453600712705,"total":2579,"current":2374} -{"_e":"metro:bundling:progress","_t":1784253937591,"id":"3","progress":0.8695983209286298,"total":2549,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253937691,"id":"1","progress":0.8809163265306124,"total":2419,"current":2227} -{"_e":"metro:bundling:progress","_t":1784253937691,"id":"2","progress":0.8702453600712705,"total":2584,"current":2384} -{"_e":"metro:bundling:progress","_t":1784253937691,"id":"3","progress":0.8695983209286298,"total":2549,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253937791,"id":"1","progress":0.8809163265306124,"total":2420,"current":2231} -{"_e":"metro:bundling:progress","_t":1784253937791,"id":"2","progress":0.8702453600712705,"total":2584,"current":2384} -{"_e":"metro:bundling:progress","_t":1784253937791,"id":"3","progress":0.8695983209286298,"total":2549,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253937892,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253937892,"id":"2","progress":0.8702453600712705,"total":2584,"current":2384} -{"_e":"metro:bundling:progress","_t":1784253937892,"id":"3","progress":0.8695983209286298,"total":2549,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253937992,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253937992,"id":"2","progress":0.8702453600712705,"total":2584,"current":2384} -{"_e":"metro:bundling:progress","_t":1784253937992,"id":"3","progress":0.8695983209286298,"total":2609,"current":2394} -{"_e":"metro:bundling:progress","_t":1784253938094,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938094,"id":"2","progress":0.8702453600712705,"total":2610,"current":2399} -{"_e":"metro:bundling:progress","_t":1784253938094,"id":"3","progress":0.8695983209286298,"total":2609,"current":2394} -{"_e":"metro:bundling:progress","_t":1784253938201,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938201,"id":"2","progress":0.8702453600712705,"total":2610,"current":2399} -{"_e":"metro:bundling:progress","_t":1784253938201,"id":"3","progress":0.8695983209286298,"total":2609,"current":2405} -{"_e":"metro:bundling:progress","_t":1784253938301,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938301,"id":"2","progress":0.8702453600712705,"total":2610,"current":2399} -{"_e":"metro:bundling:progress","_t":1784253938301,"id":"3","progress":0.8695983209286298,"total":2613,"current":2409} -{"_e":"metro:bundling:progress","_t":1784253938402,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938402,"id":"2","progress":0.8702453600712705,"total":2610,"current":2399} -{"_e":"metro:bundling:progress","_t":1784253938402,"id":"3","progress":0.8695983209286298,"total":2623,"current":2428} -{"_e":"metro:bundling:progress","_t":1784253938502,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938502,"id":"2","progress":0.8702453600712705,"total":2610,"current":2399} -{"_e":"metro:bundling:progress","_t":1784253938502,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253938603,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938603,"id":"2","progress":0.8702453600712705,"total":2616,"current":2412} -{"_e":"metro:bundling:progress","_t":1784253938603,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253938703,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938703,"id":"2","progress":0.8702453600712705,"total":2620,"current":2416} -{"_e":"metro:bundling:progress","_t":1784253938703,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253938804,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938804,"id":"2","progress":0.8702453600712705,"total":2624,"current":2421} -{"_e":"metro:bundling:progress","_t":1784253938804,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253938908,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253938909,"id":"2","progress":0.8702453600712705,"total":2630,"current":2432} -{"_e":"metro:bundling:progress","_t":1784253938909,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253939009,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253939009,"id":"2","progress":0.8702453600712705,"total":2630,"current":2433} -{"_e":"metro:bundling:progress","_t":1784253939009,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253939109,"id":"1","progress":0.8809163265306124,"total":2420,"current":2234} -{"_e":"metro:bundling:progress","_t":1784253939109,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939109,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253939219,"id":"1","progress":0.8809163265306124,"total":2427,"current":2248} -{"_e":"metro:bundling:progress","_t":1784253939219,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939219,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253939321,"id":"1","progress":0.8809163265306124,"total":2432,"current":2252} -{"_e":"metro:bundling:progress","_t":1784253939321,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939321,"id":"3","progress":0.8695983209286298,"total":2628,"current":2438} -{"_e":"metro:bundling:progress","_t":1784253939459,"id":"1","progress":0.8809163265306124,"total":2432,"current":2252} -{"_e":"metro:bundling:progress","_t":1784253939460,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939460,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253939559,"id":"1","progress":0.8809163265306124,"total":2432,"current":2270} -{"_e":"metro:bundling:progress","_t":1784253939560,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939560,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253939659,"id":"1","progress":0.8809163265306124,"total":2432,"current":2280} -{"_e":"metro:bundling:progress","_t":1784253939659,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939659,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253939760,"id":"1","progress":0.8858586784214855,"total":2432,"current":2289} -{"_e":"metro:bundling:progress","_t":1784253939760,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939760,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253939862,"id":"1","progress":0.8930521442358093,"total":2437,"current":2303} -{"_e":"metro:bundling:progress","_t":1784253939862,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939862,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253939963,"id":"1","progress":0.8930521442358093,"total":2470,"current":2327} -{"_e":"metro:bundling:progress","_t":1784253939963,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253939963,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940066,"id":"1","progress":0.9059648576439542,"total":2470,"current":2351} -{"_e":"metro:bundling:progress","_t":1784253940066,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940066,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940166,"id":"1","progress":0.9129489287388912,"total":2471,"current":2361} -{"_e":"metro:bundling:progress","_t":1784253940166,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940166,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940266,"id":"1","progress":0.9129489287388912,"total":2479,"current":2368} -{"_e":"metro:bundling:progress","_t":1784253940266,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940266,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940366,"id":"1","progress":0.9129489287388912,"total":2498,"current":2373} -{"_e":"metro:bundling:progress","_t":1784253940366,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940366,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940467,"id":"1","progress":0.9129489287388912,"total":2499,"current":2373} -{"_e":"metro:bundling:progress","_t":1784253940467,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940467,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940481,"id":"1","progress":0.9129489287388912,"total":2499,"current":2374} -{"_e":"metro:bundling:progress","_t":1784253940481,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940481,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940581,"id":"1","progress":0.9129489287388912,"total":2501,"current":2377} -{"_e":"metro:bundling:progress","_t":1784253940581,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940581,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940695,"id":"1","progress":0.9129489287388912,"total":2509,"current":2383} -{"_e":"metro:bundling:progress","_t":1784253940696,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940696,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940799,"id":"1","progress":0.9129489287388912,"total":2525,"current":2383} -{"_e":"metro:bundling:progress","_t":1784253940799,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940799,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940866,"id":"1","progress":0.9129489287388912,"total":2525,"current":2384} -{"_e":"metro:bundling:progress","_t":1784253940866,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940866,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253940967,"id":"1","progress":0.9129489287388912,"total":2533,"current":2390} -{"_e":"metro:bundling:progress","_t":1784253940967,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253940967,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941071,"id":"1","progress":0.9129489287388912,"total":2542,"current":2401} -{"_e":"metro:bundling:progress","_t":1784253941071,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941071,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941175,"id":"1","progress":0.9129489287388912,"total":2548,"current":2408} -{"_e":"metro:bundling:progress","_t":1784253941175,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941175,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941275,"id":"1","progress":0.9129489287388912,"total":2560,"current":2411} -{"_e":"metro:bundling:progress","_t":1784253941275,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941275,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941378,"id":"1","progress":0.9129489287388912,"total":2561,"current":2414} -{"_e":"metro:bundling:progress","_t":1784253941378,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941378,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941441,"id":"1","progress":0.9129489287388912,"total":2561,"current":2415} -{"_e":"metro:bundling:progress","_t":1784253941441,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941441,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941541,"id":"1","progress":0.9129489287388912,"total":2571,"current":2416} -{"_e":"metro:bundling:progress","_t":1784253941542,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941542,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941673,"id":"1","progress":0.9129489287388912,"total":2571,"current":2417} -{"_e":"metro:bundling:progress","_t":1784253941673,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941673,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253941943,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253941943,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253941943,"id":"3","progress":0.8695983209286298,"total":2630,"current":2444} -{"_e":"metro:bundling:progress","_t":1784253942043,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942043,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253942043,"id":"3","progress":0.8721516107574763,"total":2632,"current":2458} -{"_e":"metro:bundling:progress","_t":1784253942145,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942145,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253942145,"id":"3","progress":0.8835428580667215,"total":2632,"current":2474} -{"_e":"metro:bundling:progress","_t":1784253942247,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942247,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253942247,"id":"3","progress":0.8901450040411623,"total":2636,"current":2487} -{"_e":"metro:bundling:progress","_t":1784253942633,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942633,"id":"2","progress":0.8702453600712705,"total":2632,"current":2440} -{"_e":"metro:bundling:progress","_t":1784253942633,"id":"3","progress":0.8908609863199172,"total":2636,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253942732,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942732,"id":"2","progress":0.8702453600712705,"total":2634,"current":2455} -{"_e":"metro:bundling:progress","_t":1784253942732,"id":"3","progress":0.8908609863199172,"total":2636,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253942833,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942833,"id":"2","progress":0.8786393283554984,"total":2634,"current":2469} -{"_e":"metro:bundling:progress","_t":1784253942833,"id":"3","progress":0.8908609863199172,"total":2636,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253942934,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253942934,"id":"2","progress":0.8895106856631457,"total":2638,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253942934,"id":"3","progress":0.8908609863199172,"total":2636,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253943037,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943037,"id":"2","progress":0.8895106856631457,"total":2638,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253943037,"id":"3","progress":0.8987931580701055,"total":2637,"current":2500} -{"_e":"metro:bundling:progress","_t":1784253943139,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943139,"id":"2","progress":0.8895106856631457,"total":2638,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253943139,"id":"3","progress":0.9045899120626338,"total":2638,"current":2509} -{"_e":"metro:bundling:progress","_t":1784253943239,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943239,"id":"2","progress":0.8895106856631457,"total":2638,"current":2488} -{"_e":"metro:bundling:progress","_t":1784253943239,"id":"3","progress":0.9183422320652089,"total":2638,"current":2528} -{"_e":"metro:bundling:progress","_t":1784253943344,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943344,"id":"2","progress":0.8981118670897899,"total":2638,"current":2500} -{"_e":"metro:bundling:progress","_t":1784253943344,"id":"3","progress":0.9183422320652089,"total":2638,"current":2528} -{"_e":"metro:bundling:progress","_t":1784253943449,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943449,"id":"2","progress":0.9104008847380813,"total":2639,"current":2518} -{"_e":"metro:bundling:progress","_t":1784253943449,"id":"3","progress":0.9183422320652089,"total":2638,"current":2528} -{"_e":"metro:bundling:progress","_t":1784253943549,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943549,"id":"2","progress":0.9307864152892561,"total":2640,"current":2547} -{"_e":"metro:bundling:progress","_t":1784253943549,"id":"3","progress":0.9183422320652089,"total":2638,"current":2528} -{"_e":"metro:bundling:progress","_t":1784253943649,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943649,"id":"2","progress":0.9307864152892561,"total":2640,"current":2547} -{"_e":"metro:bundling:progress","_t":1784253943649,"id":"3","progress":0.9234741225461034,"total":2665,"current":2561} -{"_e":"metro:bundling:progress","_t":1784253943751,"id":"1","progress":0.9129489287388912,"total":2571,"current":2418} -{"_e":"metro:bundling:progress","_t":1784253943752,"id":"2","progress":0.9307864152892561,"total":2640,"current":2547} -{"_e":"metro:bundling:progress","_t":1784253943752,"id":"3","progress":0.9234741225461034,"total":2687,"current":2565} -{"_e":"metro:bundling:progress","_t":1784253943880,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253943880,"id":"2","progress":0.9307864152892561,"total":2640,"current":2547} -{"_e":"metro:bundling:progress","_t":1784253943880,"id":"3","progress":0.9234741225461034,"total":2687,"current":2565} -{"_e":"metro:bundling:progress","_t":1784253943982,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253943982,"id":"2","progress":0.9307864152892561,"total":2640,"current":2547} -{"_e":"metro:bundling:progress","_t":1784253943982,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944082,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944082,"id":"2","progress":0.9307864152892561,"total":2662,"current":2554} -{"_e":"metro:bundling:progress","_t":1784253944082,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944182,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944182,"id":"2","progress":0.9307864152892561,"total":2663,"current":2557} -{"_e":"metro:bundling:progress","_t":1784253944182,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944282,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944282,"id":"2","progress":0.9307864152892561,"total":2689,"current":2565} -{"_e":"metro:bundling:progress","_t":1784253944282,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944383,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944383,"id":"2","progress":0.9307864152892561,"total":2689,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253944383,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944483,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944483,"id":"2","progress":0.9307864152892561,"total":2706,"current":2580} -{"_e":"metro:bundling:progress","_t":1784253944483,"id":"3","progress":0.9234741225461034,"total":2700,"current":2572} -{"_e":"metro:bundling:progress","_t":1784253944584,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944584,"id":"2","progress":0.9307864152892561,"total":2706,"current":2580} -{"_e":"metro:bundling:progress","_t":1784253944584,"id":"3","progress":0.9234741225461034,"total":2743,"current":2589} -{"_e":"metro:bundling:progress","_t":1784253944684,"id":"1","progress":0.9129489287388912,"total":2572,"current":2419} -{"_e":"metro:bundling:progress","_t":1784253944684,"id":"2","progress":0.9307864152892561,"total":2815,"current":2602} -{"_e":"metro:bundling:progress","_t":1784253944684,"id":"3","progress":0.9234741225461034,"total":2743,"current":2589} -{"_e":"metro:bundling:progress","_t":1784253944784,"id":"1","progress":0.9129489287388912,"total":2573,"current":2424} -{"_e":"metro:bundling:progress","_t":1784253944784,"id":"2","progress":0.9307864152892561,"total":2815,"current":2602} -{"_e":"metro:bundling:progress","_t":1784253944784,"id":"3","progress":0.9234741225461034,"total":2743,"current":2589} -{"_e":"metro:bundling:progress","_t":1784253944884,"id":"1","progress":0.9129489287388912,"total":2573,"current":2424} -{"_e":"metro:bundling:progress","_t":1784253944884,"id":"2","progress":0.9307864152892561,"total":2815,"current":2602} -{"_e":"metro:bundling:progress","_t":1784253944884,"id":"3","progress":0.9234741225461034,"total":2822,"current":2614} -{"_e":"metro:bundling:progress","_t":1784253944985,"id":"1","progress":0.9129489287388912,"total":2573,"current":2424} -{"_e":"metro:bundling:progress","_t":1784253944985,"id":"2","progress":0.9307864152892561,"total":2815,"current":2602} -{"_e":"metro:bundling:progress","_t":1784253944985,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945090,"id":"1","progress":0.9129489287388912,"total":2573,"current":2424} -{"_e":"metro:bundling:progress","_t":1784253945090,"id":"2","progress":0.9307864152892561,"total":2828,"current":2622} -{"_e":"metro:bundling:progress","_t":1784253945090,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945190,"id":"1","progress":0.9129489287388912,"total":2573,"current":2424} -{"_e":"metro:bundling:progress","_t":1784253945190,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945190,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945290,"id":"1","progress":0.9129489287388912,"total":2588,"current":2432} -{"_e":"metro:bundling:progress","_t":1784253945290,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945290,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945391,"id":"1","progress":0.9129489287388912,"total":2589,"current":2439} -{"_e":"metro:bundling:progress","_t":1784253945391,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945391,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945495,"id":"1","progress":0.9129489287388912,"total":2594,"current":2449} -{"_e":"metro:bundling:progress","_t":1784253945495,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945495,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945601,"id":"1","progress":0.9129489287388912,"total":2599,"current":2462} -{"_e":"metro:bundling:progress","_t":1784253945601,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945601,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945703,"id":"1","progress":0.9129489287388912,"total":2604,"current":2474} -{"_e":"metro:bundling:progress","_t":1784253945703,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945703,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945803,"id":"1","progress":0.9129489287388912,"total":2623,"current":2483} -{"_e":"metro:bundling:progress","_t":1784253945803,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945803,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253945903,"id":"1","progress":0.9129489287388912,"total":2623,"current":2490} -{"_e":"metro:bundling:progress","_t":1784253945903,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253945903,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946004,"id":"1","progress":0.9129489287388912,"total":2639,"current":2496} -{"_e":"metro:bundling:progress","_t":1784253946004,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946004,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946104,"id":"1","progress":0.9129489287388912,"total":2644,"current":2505} -{"_e":"metro:bundling:progress","_t":1784253946104,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946104,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946206,"id":"1","progress":0.9129489287388912,"total":2649,"current":2509} -{"_e":"metro:bundling:progress","_t":1784253946206,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946206,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946309,"id":"1","progress":0.9129489287388912,"total":2652,"current":2515} -{"_e":"metro:bundling:progress","_t":1784253946310,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946310,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946420,"id":"1","progress":0.9129489287388912,"total":2654,"current":2524} -{"_e":"metro:bundling:progress","_t":1784253946420,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946420,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946520,"id":"1","progress":0.9129489287388912,"total":2667,"current":2530} -{"_e":"metro:bundling:progress","_t":1784253946524,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946524,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946620,"id":"1","progress":0.9129489287388912,"total":2682,"current":2541} -{"_e":"metro:bundling:progress","_t":1784253946620,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946620,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946730,"id":"1","progress":0.9129489287388912,"total":2684,"current":2549} -{"_e":"metro:bundling:progress","_t":1784253946730,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946730,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946830,"id":"1","progress":0.9129489287388912,"total":2687,"current":2559} -{"_e":"metro:bundling:progress","_t":1784253946830,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946830,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253946930,"id":"1","progress":0.9129489287388912,"total":2687,"current":2564} -{"_e":"metro:bundling:progress","_t":1784253946930,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253946930,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253947032,"id":"1","progress":0.9129489287388912,"total":2687,"current":2565} -{"_e":"metro:bundling:progress","_t":1784253947033,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947033,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253947132,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947132,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947132,"id":"3","progress":0.9234741225461034,"total":2828,"current":2623} -{"_e":"metro:bundling:progress","_t":1784253947235,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947235,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947235,"id":"3","progress":0.9234741225461034,"total":2832,"current":2636} -{"_e":"metro:bundling:progress","_t":1784253947335,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947335,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947335,"id":"3","progress":0.9234741225461034,"total":2856,"current":2644} -{"_e":"metro:bundling:progress","_t":1784253947435,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947435,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947435,"id":"3","progress":0.9234741225461034,"total":2868,"current":2653} -{"_e":"metro:bundling:progress","_t":1784253947556,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947556,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947556,"id":"3","progress":0.9234741225461034,"total":2878,"current":2668} -{"_e":"metro:bundling:progress","_t":1784253947656,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947656,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947656,"id":"3","progress":0.9234741225461034,"total":2882,"current":2676} -{"_e":"metro:bundling:progress","_t":1784253947757,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947757,"id":"2","progress":0.9307864152892561,"total":2833,"current":2632} -{"_e":"metro:bundling:progress","_t":1784253947757,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253947858,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947859,"id":"2","progress":0.9307864152892561,"total":2855,"current":2650} -{"_e":"metro:bundling:progress","_t":1784253947859,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253947958,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253947958,"id":"2","progress":0.9307864152892561,"total":2860,"current":2656} -{"_e":"metro:bundling:progress","_t":1784253947958,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948059,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948059,"id":"2","progress":0.9307864152892561,"total":2880,"current":2670} -{"_e":"metro:bundling:progress","_t":1784253948059,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948161,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948161,"id":"2","progress":0.9307864152892561,"total":2883,"current":2678} -{"_e":"metro:bundling:progress","_t":1784253948161,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948262,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948262,"id":"2","progress":0.9307864152892561,"total":2887,"current":2689} -{"_e":"metro:bundling:progress","_t":1784253948262,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948363,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948363,"id":"2","progress":0.9307864152892561,"total":2910,"current":2703} -{"_e":"metro:bundling:progress","_t":1784253948363,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948467,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948467,"id":"2","progress":0.9307864152892561,"total":2913,"current":2707} -{"_e":"metro:bundling:progress","_t":1784253948467,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948566,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948566,"id":"2","progress":0.9307864152892561,"total":2921,"current":2715} -{"_e":"metro:bundling:progress","_t":1784253948566,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948667,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948667,"id":"2","progress":0.9307864152892561,"total":2921,"current":2739} -{"_e":"metro:bundling:progress","_t":1784253948667,"id":"3","progress":0.9234741225461034,"total":2905,"current":2693} -{"_e":"metro:bundling:progress","_t":1784253948766,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948766,"id":"2","progress":0.9307864152892561,"total":2921,"current":2739} -{"_e":"metro:bundling:progress","_t":1784253948766,"id":"3","progress":0.9234741225461034,"total":2919,"current":2727} -{"_e":"metro:bundling:progress","_t":1784253948866,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948866,"id":"2","progress":0.9307864152892561,"total":2933,"current":2763} -{"_e":"metro:bundling:progress","_t":1784253948866,"id":"3","progress":0.9234741225461034,"total":2919,"current":2727} -{"_e":"metro:bundling:progress","_t":1784253948967,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253948967,"id":"2","progress":0.9307864152892561,"total":2933,"current":2763} -{"_e":"metro:bundling:progress","_t":1784253948967,"id":"3","progress":0.9234741225461034,"total":2921,"current":2745} -{"_e":"metro:bundling:progress","_t":1784253949068,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949068,"id":"2","progress":0.9307864152892561,"total":2933,"current":2763} -{"_e":"metro:bundling:progress","_t":1784253949068,"id":"3","progress":0.9234741225461034,"total":2934,"current":2771} -{"_e":"metro:bundling:progress","_t":1784253949169,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949169,"id":"2","progress":0.9307864152892561,"total":2933,"current":2763} -{"_e":"metro:bundling:progress","_t":1784253949169,"id":"3","progress":0.9234741225461034,"total":2942,"current":2800} -{"_e":"metro:bundling:progress","_t":1784253949269,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949269,"id":"2","progress":0.9307864152892561,"total":2933,"current":2763} -{"_e":"metro:bundling:progress","_t":1784253949269,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949369,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949369,"id":"2","progress":0.9307864152892561,"total":2944,"current":2802} -{"_e":"metro:bundling:progress","_t":1784253949369,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949469,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949469,"id":"2","progress":0.9307864152892561,"total":2957,"current":2818} -{"_e":"metro:bundling:progress","_t":1784253949469,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949569,"id":"1","progress":0.9129489287388912,"total":2687,"current":2566} -{"_e":"metro:bundling:progress","_t":1784253949569,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253949569,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949669,"id":"1","progress":0.9206876377245182,"total":2693,"current":2584} -{"_e":"metro:bundling:progress","_t":1784253949669,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253949669,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949771,"id":"1","progress":0.9314077605443498,"total":2693,"current":2599} -{"_e":"metro:bundling:progress","_t":1784253949771,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253949771,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949874,"id":"1","progress":0.9358770919067215,"total":2700,"current":2612} -{"_e":"metro:bundling:progress","_t":1784253949874,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253949874,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253949974,"id":"1","progress":0.945216049382716,"total":2700,"current":2625} -{"_e":"metro:bundling:progress","_t":1784253949974,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253949974,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950075,"id":"1","progress":0.9460938539782557,"total":2708,"current":2634} -{"_e":"metro:bundling:progress","_t":1784253950075,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950075,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950180,"id":"1","progress":0.9468704150923578,"total":2711,"current":2638} -{"_e":"metro:bundling:progress","_t":1784253950180,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950180,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950280,"id":"1","progress":0.9512180707244433,"total":2713,"current":2646} -{"_e":"metro:bundling:progress","_t":1784253950280,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950280,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950381,"id":"1","progress":0.9512180707244433,"total":2724,"current":2653} -{"_e":"metro:bundling:progress","_t":1784253950381,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950381,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950482,"id":"1","progress":0.9512180707244433,"total":2726,"current":2658} -{"_e":"metro:bundling:progress","_t":1784253950482,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950482,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950582,"id":"1","progress":0.9535959529952324,"total":2726,"current":2662} -{"_e":"metro:bundling:progress","_t":1784253950582,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950582,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950683,"id":"1","progress":0.9578995020371208,"total":2726,"current":2668} -{"_e":"metro:bundling:progress","_t":1784253950683,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950683,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950815,"id":"1","progress":0.9586177022008655,"total":2726,"current":2669} -{"_e":"metro:bundling:progress","_t":1784253950815,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950815,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253950916,"id":"1","progress":0.9600549099484382,"total":2726,"current":2671} -{"_e":"metro:bundling:progress","_t":1784253950916,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253950916,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253951019,"id":"1","progress":0.962212740120004,"total":2726,"current":2674} -{"_e":"metro:bundling:progress","_t":1784253951019,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951019,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253951128,"id":"1","progress":0.9629325551239148,"total":2726,"current":2675} -{"_e":"metro:bundling:progress","_t":1784253951128,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951128,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253951142,"id":"1","progress":0.963652639267853,"total":2726,"current":2676} -{"_e":"metro:bundling:progress","_t":1784253951142,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951142,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253951243,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951243,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951243,"id":"3","progress":0.9234741225461034,"total":2952,"current":2810} -{"_e":"metro:bundling:progress","_t":1784253951367,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951367,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951370,"id":"3","progress":0.9234741225461034,"total":2959,"current":2833} -{"_e":"metro:bundling:progress","_t":1784253951467,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951467,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951467,"id":"3","progress":0.9234741225461034,"total":2968,"current":2838} -{"_e":"metro:bundling:progress","_t":1784253951568,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951568,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951568,"id":"3","progress":0.9234741225461034,"total":2983,"current":2848} -{"_e":"metro:bundling:progress","_t":1784253951681,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951681,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951681,"id":"3","progress":0.9234741225461034,"total":2987,"current":2853} -{"_e":"metro:bundling:progress","_t":1784253951781,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951781,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951781,"id":"3","progress":0.9234741225461034,"total":2996,"current":2868} -{"_e":"metro:bundling:progress","_t":1784253951881,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951881,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951881,"id":"3","progress":0.9234741225461034,"total":3009,"current":2882} -{"_e":"metro:bundling:progress","_t":1784253951981,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253951981,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253951981,"id":"3","progress":0.9234741225461034,"total":3011,"current":2887} -{"_e":"metro:bundling:progress","_t":1784253952084,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952084,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253952084,"id":"3","progress":0.9234741225461034,"total":3011,"current":2893} -{"_e":"metro:bundling:progress","_t":1784253952201,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952201,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253952201,"id":"3","progress":0.9237948622128471,"total":3011,"current":2894} -{"_e":"metro:bundling:progress","_t":1784253952302,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952302,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253952302,"id":"3","progress":0.9276293576933288,"total":3011,"current":2900} -{"_e":"metro:bundling:progress","_t":1784253952417,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952417,"id":"2","progress":0.9307864152892561,"total":2960,"current":2827} -{"_e":"metro:bundling:progress","_t":1784253952417,"id":"3","progress":0.9308533903341922,"total":3012,"current":2906} -{"_e":"metro:bundling:progress","_t":1784253952534,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952534,"id":"2","progress":0.9307864152892561,"total":2977,"current":2846} -{"_e":"metro:bundling:progress","_t":1784253952534,"id":"3","progress":0.9308533903341922,"total":3012,"current":2906} -{"_e":"metro:bundling:progress","_t":1784253952635,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952635,"id":"2","progress":0.9307864152892561,"total":2977,"current":2846} -{"_e":"metro:bundling:progress","_t":1784253952635,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253952734,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952734,"id":"2","progress":0.9307864152892561,"total":2990,"current":2857} -{"_e":"metro:bundling:progress","_t":1784253952735,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253952838,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952838,"id":"2","progress":0.9307864152892561,"total":2998,"current":2870} -{"_e":"metro:bundling:progress","_t":1784253952838,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253952941,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253952941,"id":"2","progress":0.9307864152892561,"total":3012,"current":2885} -{"_e":"metro:bundling:progress","_t":1784253952941,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953040,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953040,"id":"2","progress":0.9307864152892561,"total":3013,"current":2889} -{"_e":"metro:bundling:progress","_t":1784253953040,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953139,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953139,"id":"2","progress":0.9307864152892561,"total":3013,"current":2890} -{"_e":"metro:bundling:progress","_t":1784253953139,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953240,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953240,"id":"2","progress":0.9307864152892561,"total":3013,"current":2895} -{"_e":"metro:bundling:progress","_t":1784253953240,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953362,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953362,"id":"2","progress":0.9307864152892561,"total":3013,"current":2900} -{"_e":"metro:bundling:progress","_t":1784253953362,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953462,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953462,"id":"2","progress":0.931538795508155,"total":3014,"current":2909} -{"_e":"metro:bundling:progress","_t":1784253953462,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953562,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953562,"id":"2","progress":0.9328420363632363,"total":3015,"current":2912} -{"_e":"metro:bundling:progress","_t":1784253953562,"id":"3","progress":0.9321351160210861,"total":3012,"current":2908} -{"_e":"metro:bundling:progress","_t":1784253953683,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953683,"id":"2","progress":0.9328420363632363,"total":3015,"current":2912} -{"_e":"metro:bundling:progress","_t":1784253953683,"id":"3","progress":0.9353643890084001,"total":3013,"current":2914} -{"_e":"metro:bundling:progress","_t":1784253953747,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953747,"id":"2","progress":0.9328420363632363,"total":3015,"current":2912} -{"_e":"metro:bundling:progress","_t":1784253953747,"id":"3","progress":0.9360064788395104,"total":3013,"current":2915} -{"_e":"metro:bundling:progress","_t":1784253953847,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953847,"id":"2","progress":0.9328420363632363,"total":3015,"current":2912} -{"_e":"metro:bundling:progress","_t":1784253953847,"id":"3","progress":0.9372913194279595,"total":3013,"current":2917} -{"_e":"metro:bundling:progress","_t":1784253953976,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253953976,"id":"2","progress":0.936048227629129,"total":3015,"current":2917} -{"_e":"metro:bundling:progress","_t":1784253953976,"id":"3","progress":0.9372913194279595,"total":3013,"current":2917} -{"_e":"metro:bundling:progress","_t":1784253954077,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253954077,"id":"2","progress":0.9386571883182351,"total":3017,"current":2923} -{"_e":"metro:bundling:progress","_t":1784253954077,"id":"3","progress":0.9372913194279595,"total":3013,"current":2917} -{"_e":"metro:bundling:progress","_t":1784253954177,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253954177,"id":"2","progress":0.9386571883182351,"total":3017,"current":2923} -{"_e":"metro:bundling:progress","_t":1784253954177,"id":"3","progress":0.9399225351617192,"total":3016,"current":2924} -{"_e":"metro:bundling:progress","_t":1784253954278,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253954278,"id":"2","progress":0.9458061472155467,"total":3021,"current":2938} -{"_e":"metro:bundling:progress","_t":1784253954278,"id":"3","progress":0.9399225351617192,"total":3016,"current":2924} -{"_e":"metro:bundling:progress","_t":1784253954379,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253954379,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954379,"id":"3","progress":0.9399225351617192,"total":3016,"current":2924} -{"_e":"metro:bundling:progress","_t":1784253954479,"id":"1","progress":0.9658269335062096,"total":2727,"current":2680} -{"_e":"metro:bundling:progress","_t":1784253954479,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954479,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253954579,"id":"1","progress":0.9667533298200579,"total":2744,"current":2698} -{"_e":"metro:bundling:progress","_t":1784253954579,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954579,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253954679,"id":"1","progress":0.9703505960497809,"total":2745,"current":2704} -{"_e":"metro:bundling:progress","_t":1784253954679,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954679,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253954779,"id":"1","progress":0.9717865567798382,"total":2745,"current":2706} -{"_e":"metro:bundling:progress","_t":1784253954779,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954779,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253954879,"id":"1","progress":0.9717865567798382,"total":2761,"current":2716} -{"_e":"metro:bundling:progress","_t":1784253954879,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954879,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253954980,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253954980,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253954980,"id":"3","progress":0.9504963763827877,"total":3032,"current":2956} -{"_e":"metro:bundling:progress","_t":1784253955080,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955080,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253955080,"id":"3","progress":0.9531163336038366,"total":3035,"current":2963} -{"_e":"metro:bundling:progress","_t":1784253955181,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955181,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253955181,"id":"3","progress":0.964743239231983,"total":3036,"current":2982} -{"_e":"metro:bundling:progress","_t":1784253955282,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955283,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253955283,"id":"3","progress":0.969936364900938,"total":3037,"current":2991} -{"_e":"metro:bundling:progress","_t":1784253955382,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955382,"id":"2","progress":0.9458061472155467,"total":3028,"current":2944} -{"_e":"metro:bundling:progress","_t":1784253955382,"id":"3","progress":0.969936364900938,"total":3057,"current":3007} -{"_e":"metro:bundling:progress","_t":1784253955485,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955485,"id":"2","progress":0.9589018371877673,"total":3034,"current":2971} -{"_e":"metro:bundling:progress","_t":1784253955485,"id":"3","progress":0.969936364900938,"total":3057,"current":3007} -{"_e":"metro:bundling:progress","_t":1784253955591,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955591,"id":"2","progress":0.9654693073288776,"total":3043,"current":2990} -{"_e":"metro:bundling:progress","_t":1784253955591,"id":"3","progress":0.969936364900938,"total":3057,"current":3007} -{"_e":"metro:bundling:progress","_t":1784253955699,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955699,"id":"2","progress":0.9699951910662906,"total":3043,"current":2997} -{"_e":"metro:bundling:progress","_t":1784253955699,"id":"3","progress":0.969936364900938,"total":3057,"current":3007} -{"_e":"metro:bundling:progress","_t":1784253955799,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955799,"id":"2","progress":0.970063531308788,"total":3050,"current":3004} -{"_e":"metro:bundling:progress","_t":1784253955799,"id":"3","progress":0.969936364900938,"total":3057,"current":3007} -{"_e":"metro:bundling:progress","_t":1784253955899,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253955899,"id":"2","progress":0.970063531308788,"total":3050,"current":3004} -{"_e":"metro:bundling:progress","_t":1784253955899,"id":"3","progress":0.9727197016392474,"total":3058,"current":3016} -{"_e":"metro:bundling:progress","_t":1784253956004,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253956005,"id":"2","progress":0.970063531308788,"total":3050,"current":3004} -{"_e":"metro:bundling:progress","_t":1784253956005,"id":"3","progress":0.9733648481654655,"total":3058,"current":3017} -{"_e":"metro:bundling:progress","_t":1784253956028,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253956028,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956028,"id":"3","progress":0.9733648481654655,"total":3058,"current":3017} -{"_e":"metro:bundling:progress","_t":1784253956128,"id":"1","progress":0.9717865567798382,"total":2763,"current":2722} -{"_e":"metro:bundling:progress","_t":1784253956128,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956128,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956227,"id":"1","progress":0.9777025529006668,"total":2765,"current":2734} -{"_e":"metro:bundling:progress","_t":1784253956227,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956227,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956437,"id":"1","progress":0.9784179013698092,"total":2765,"current":2735} -{"_e":"metro:bundling:progress","_t":1784253956437,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956437,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956597,"id":"1","progress":0.9791335114401472,"total":2765,"current":2736} -{"_e":"metro:bundling:progress","_t":1784253956597,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956597,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956697,"id":"1","progress":0.9798566311616786,"total":2766,"current":2738} -{"_e":"metro:bundling:progress","_t":1784253956698,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956698,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956768,"id":"1","progress":0.9805725081286084,"total":2766,"current":2739} -{"_e":"metro:bundling:progress","_t":1784253956769,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956769,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956868,"id":"1","progress":0.9806073915264831,"total":2771,"current":2744} -{"_e":"metro:bundling:progress","_t":1784253956868,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956868,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253956968,"id":"1","progress":0.9806073915264831,"total":2774,"current":2745} -{"_e":"metro:bundling:progress","_t":1784253956968,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253956968,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253957153,"id":"1","progress":0.9806073915264831,"total":2774,"current":2746} -{"_e":"metro:bundling:progress","_t":1784253957153,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253957153,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253957253,"id":"1","progress":0.9813690930643475,"total":2778,"current":2752} -{"_e":"metro:bundling:progress","_t":1784253957253,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253957253,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253957358,"id":"1","progress":0.9842239834636124,"total":2778,"current":2756} -{"_e":"metro:bundling:progress","_t":1784253957358,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253957358,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253957459,"id":"1","progress":0.9842239834636124,"total":2797,"current":2764} -{"_e":"metro:bundling:progress","_t":1784253957459,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253957459,"id":"3","progress":0.9772402186461782,"total":3058,"current":3023} -{"_e":"metro:bundling:progress","_t":1784253957559,"id":"1","progress":0.9842239834636124,"total":2797,"current":2764} -{"_e":"metro:bundling:progress","_t":1784253957559,"id":"2","progress":0.9740270836003248,"total":3060,"current":3020} -{"_e":"metro:bundling:progress","_t":1784253957559,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253957661,"id":"1","progress":0.9842239834636124,"total":2797,"current":2764} -{"_e":"metro:bundling:progress","_t":1784253957661,"id":"2","progress":0.9774237237278626,"total":3083,"current":3048} -{"_e":"metro:bundling:progress","_t":1784253957661,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253957761,"id":"1","progress":0.9842239834636124,"total":2802,"current":2770} -{"_e":"metro:bundling:progress","_t":1784253957761,"id":"2","progress":0.9774237237278626,"total":3083,"current":3048} -{"_e":"metro:bundling:progress","_t":1784253957761,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253957862,"id":"1","progress":0.9842239834636124,"total":2827,"current":2783} -{"_e":"metro:bundling:progress","_t":1784253957862,"id":"2","progress":0.9774237237278626,"total":3083,"current":3048} -{"_e":"metro:bundling:progress","_t":1784253957862,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253957963,"id":"1","progress":0.9842239834636124,"total":2835,"current":2793} -{"_e":"metro:bundling:progress","_t":1784253957963,"id":"2","progress":0.9774237237278626,"total":3083,"current":3048} -{"_e":"metro:bundling:progress","_t":1784253957963,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253958063,"id":"1","progress":0.9842239834636124,"total":2835,"current":2793} -{"_e":"metro:bundling:progress","_t":1784253958063,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958063,"id":"3","progress":0.9825217802661994,"total":3076,"current":3049} -{"_e":"metro:bundling:progress","_t":1784253958163,"id":"1","progress":0.9842239834636124,"total":2835,"current":2793} -{"_e":"metro:bundling:progress","_t":1784253958163,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958163,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958263,"id":"1","progress":0.9842239834636124,"total":2840,"current":2802} -{"_e":"metro:bundling:progress","_t":1784253958263,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958263,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958367,"id":"1","progress":0.9842239834636124,"total":2849,"current":2813} -{"_e":"metro:bundling:progress","_t":1784253958367,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958367,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958483,"id":"1","progress":0.9842239834636124,"total":2855,"current":2815} -{"_e":"metro:bundling:progress","_t":1784253958483,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958483,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958561,"id":"1","progress":0.9842239834636124,"total":2855,"current":2816} -{"_e":"metro:bundling:progress","_t":1784253958561,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958561,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958662,"id":"1","progress":0.9842239834636124,"total":2855,"current":2819} -{"_e":"metro:bundling:progress","_t":1784253958662,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958662,"id":"3","progress":0.9825217802661994,"total":3124,"current":3095} -{"_e":"metro:bundling:progress","_t":1784253958766,"id":"1","progress":0.9842239834636124,"total":2855,"current":2819} -{"_e":"metro:bundling:progress","_t":1784253958766,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958766,"id":"3","progress":0.9825217802661994,"total":3129,"current":3097} -{"_e":"metro:bundling:progress","_t":1784253958870,"id":"1","progress":0.9842239834636124,"total":2863,"current":2835} -{"_e":"metro:bundling:progress","_t":1784253958870,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958870,"id":"3","progress":0.9825217802661994,"total":3129,"current":3097} -{"_e":"metro:bundling:progress","_t":1784253958970,"id":"1","progress":0.9842239834636124,"total":2863,"current":2835} -{"_e":"metro:bundling:progress","_t":1784253958971,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253958971,"id":"3","progress":0.9825217802661994,"total":3150,"current":3120} -{"_e":"metro:bundling:progress","_t":1784253959070,"id":"1","progress":0.9842239834636124,"total":2865,"current":2841} -{"_e":"metro:bundling:progress","_t":1784253959070,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253959070,"id":"3","progress":0.9825217802661994,"total":3150,"current":3120} -{"_e":"metro:bundling:progress","_t":1784253959170,"id":"1","progress":0.9874870888114703,"total":2868,"current":2850} -{"_e":"metro:bundling:progress","_t":1784253959170,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253959170,"id":"3","progress":0.9825217802661994,"total":3150,"current":3120} -{"_e":"metro:bundling:progress","_t":1784253959270,"id":"1","progress":0.9874870888114703,"total":2868,"current":2850} -{"_e":"metro:bundling:progress","_t":1784253959270,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253959270,"id":"3","progress":0.9848582627993041,"total":3158,"current":3134} -{"_e":"metro:bundling:progress","_t":1784253959370,"id":"1","progress":0.9874870888114703,"total":2868,"current":2850} -{"_e":"metro:bundling:progress","_t":1784253959370,"id":"2","progress":0.9858568158168575,"total":3100,"current":3078} -{"_e":"metro:bundling:progress","_t":1784253959370,"id":"3","progress":0.9917864824129113,"total":3159,"current":3146} -{"_e":"metro:bundling:progress","_t":1784253959470,"id":"1","progress":0.9874870888114703,"total":2868,"current":2850} -{"_e":"metro:bundling:progress","_t":1784253959470,"id":"2","progress":0.9949495030215078,"total":3164,"current":3156} -{"_e":"metro:bundling:progress","_t":1784253959470,"id":"3","progress":0.9917864824129113,"total":3159,"current":3146} -{"_e":"metro:bundling:progress","_t":1784253959584,"id":"1","progress":0.9874870888114703,"total":2868,"current":2850} -{"_e":"metro:bundling:progress","_t":1784253959584,"id":"2","progress":0.9949495030215078,"total":3164,"current":3156} -{"_e":"metro:bundling:progress","_t":1784253959584,"id":"3","progress":0.999,"total":3164,"current":3164} -{"_e":"metro:bundling:progress","_t":1784253959684,"id":"1","progress":0.999,"total":2871,"current":2871} -{"_e":"metro:bundling:progress","_t":1784253959684,"id":"2","progress":0.9949495030215078,"total":3164,"current":3156} -{"_e":"metro:bundling:progress","_t":1784253959684,"id":"3","progress":0.999,"total":3164,"current":3164} -{"_e":"metro:bundling:done","_t":1784253960398,"id":"1","total":2871,"ms":67320.986644} -{"_e":"metro:bundling:progress","_t":1784253960398,"id":"2","progress":0.9949495030215078,"total":3164,"current":3156} -{"_e":"metro:bundling:progress","_t":1784253960398,"id":"3","progress":0.999,"total":3164,"current":3164} -{"_e":"metro:bundling:done","_t":1784253976211,"id":"3","total":3164,"ms":83132.505695} -{"_e":"metro:bundling:progress","_t":1784253976212,"id":"2","progress":0.9949495030215078,"total":3164,"current":3156} -{"_e":"metro:bundling:done","_t":1784253991451,"id":"2","total":3164,"ms":98372.448928} diff --git a/.expo/dev/logs/start.log b/.expo/dev/logs/start.log deleted file mode 100644 index 6870b6c..0000000 --- a/.expo/dev/logs/start.log +++ /dev/null @@ -1,412 +0,0 @@ -{"_e":"root:init","_t":1784254504055,"format":"v0-jsonl","version":"57.0.8"} -{"_e":"env:mode","_t":1784254504056,"nodeEnv":"development","babelEnv":"development","mode":"development"} -{"_e":"env:load","_t":1784254504058,"mode":"development","files":[],"env":{}} -{"_e":"devserver:start","_t":1784254508949,"mode":"development","web":true,"baseUrl":"","asyncRoutes":false,"routerRoot":"../../../app","serverComponents":false,"serverActions":false,"serverRendering":false,"apiRoutes":false,"exporting":false} -{"_e":"metro:config","_t":1784254509422,"serverRoot":"../../..","projectRoot":"../../..","exporting":false,"flags":{"autolinkingModuleResolution":false,"serverActions":false,"serverComponents":false,"reactCompiler":false,"optimizeGraph":false,"treeshaking":false,"logbox":false}} -{"_e":"expo:dev-tools-plugin:load","_t":1784254509956,"plugins":[]} -{"_e":"metro:instantiate","_t":1784254516842,"atlas":false,"workers":3,"host":"::","port":8086} -{"_e":"metro:bundling:started","_t":1784254564715,"id":"1","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784254564715,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784254564729,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784254565214,"id":"1","progress":0.010000000000000002,"total":1,"current":1} -{"_e":"metro:bundling:progress","_t":1784254565318,"id":"1","progress":0.09,"total":9,"current":3} -{"_e":"metro:bundling:progress","_t":1784254565418,"id":"1","progress":0.09,"total":41,"current":7} -{"_e":"metro:bundling:progress","_t":1784254565518,"id":"1","progress":0.09,"total":46,"current":11} -{"_e":"metro:bundling:progress","_t":1784254565577,"id":"1","progress":0.09,"total":46,"current":12} -{"_e":"metro:bundling:progress","_t":1784254565690,"id":"1","progress":0.09,"total":147,"current":14} -{"_e":"metro:bundling:progress","_t":1784254565794,"id":"1","progress":0.09,"total":156,"current":24} -{"_e":"metro:bundling:progress","_t":1784254565894,"id":"1","progress":0.09,"total":157,"current":31} -{"_e":"metro:bundling:progress","_t":1784254565998,"id":"1","progress":0.09,"total":185,"current":45} -{"_e":"metro:bundling:progress","_t":1784254566099,"id":"1","progress":0.09,"total":197,"current":52} -{"_e":"metro:bundling:progress","_t":1784254566211,"id":"1","progress":0.09,"total":210,"current":59} -{"_e":"metro:bundling:progress","_t":1784254566311,"id":"1","progress":0.09,"total":223,"current":66} -{"_e":"metro:bundling:progress","_t":1784254566419,"id":"1","progress":0.09782840730462457,"total":227,"current":71} -{"_e":"metro:bundling:progress","_t":1784254566519,"id":"1","progress":0.11201999167013746,"total":245,"current":82} -{"_e":"metro:bundling:progress","_t":1784254566623,"id":"1","progress":0.15123456790123457,"total":270,"current":105} -{"_e":"metro:bundling:progress","_t":1784254566723,"id":"1","progress":0.18367346938775508,"total":287,"current":123} -{"_e":"metro:bundling:progress","_t":1784254566823,"id":"1","progress":0.2352733413538482,"total":301,"current":146} -{"_e":"metro:bundling:progress","_t":1784254566923,"id":"1","progress":0.259462890625,"total":320,"current":163} -{"_e":"metro:bundling:progress","_t":1784254567024,"id":"1","progress":0.27952464836940155,"total":331,"current":175} -{"_e":"metro:bundling:progress","_t":1784254567124,"id":"1","progress":0.33271161520688924,"total":345,"current":199} -{"_e":"metro:bundling:progress","_t":1784254567225,"id":"1","progress":0.35676406135865596,"total":370,"current":221} -{"_e":"metro:bundling:progress","_t":1784254567326,"id":"1","progress":0.37024645369120834,"total":401,"current":244} -{"_e":"metro:bundling:progress","_t":1784254567428,"id":"1","progress":0.37472705039741466,"total":428,"current":262} -{"_e":"metro:bundling:progress","_t":1784254567529,"id":"1","progress":0.3978698224852071,"total":455,"current":287} -{"_e":"metro:bundling:progress","_t":1784254567628,"id":"1","progress":0.41077662667090886,"total":479,"current":307} -{"_e":"metro:bundling:progress","_t":1784254567730,"id":"1","progress":0.42145226326742974,"total":496,"current":322} -{"_e":"metro:bundling:progress","_t":1784254567834,"id":"1","progress":0.42145226326742974,"total":536,"current":333} -{"_e":"metro:bundling:progress","_t":1784254567938,"id":"1","progress":0.42145226326742974,"total":540,"current":339} -{"_e":"metro:bundling:progress","_t":1784254568057,"id":"1","progress":0.42145226326742974,"total":543,"current":345} -{"_e":"metro:bundling:progress","_t":1784254568158,"id":"1","progress":0.42145226326742974,"total":556,"current":354} -{"_e":"metro:bundling:progress","_t":1784254568257,"id":"1","progress":0.42145226326742974,"total":556,"current":356} -{"_e":"metro:bundling:progress","_t":1784254568357,"id":"1","progress":0.42472014414228576,"total":557,"current":363} -{"_e":"metro:bundling:progress","_t":1784254568458,"id":"1","progress":0.42472014414228576,"total":571,"current":370} -{"_e":"metro:bundling:progress","_t":1784254568559,"id":"1","progress":0.44212055590581395,"total":573,"current":381} -{"_e":"metro:bundling:progress","_t":1784254568663,"id":"1","progress":0.46466158211707237,"total":578,"current":394} -{"_e":"metro:bundling:progress","_t":1784254568764,"id":"1","progress":0.48831470460153875,"total":581,"current":406} -{"_e":"metro:bundling:progress","_t":1784254568909,"id":"1","progress":0.500828402366864,"total":585,"current":414} -{"_e":"metro:bundling:progress","_t":1784254569015,"id":"1","progress":0.500828402366864,"total":2334,"current":415} -{"_e":"metro:bundling:progress","_t":1784254569115,"id":"1","progress":0.500828402366864,"total":2338,"current":435} -{"_e":"metro:bundling:progress","_t":1784254569222,"id":"1","progress":0.500828402366864,"total":2343,"current":440} -{"_e":"metro:bundling:progress","_t":1784254569326,"id":"1","progress":0.500828402366864,"total":2346,"current":459} -{"_e":"metro:bundling:progress","_t":1784254569467,"id":"1","progress":0.500828402366864,"total":2347,"current":467} -{"_e":"metro:bundling:progress","_t":1784254569567,"id":"1","progress":0.500828402366864,"total":2348,"current":472} -{"_e":"metro:bundling:progress","_t":1784254569667,"id":"1","progress":0.500828402366864,"total":2367,"current":491} -{"_e":"metro:bundling:progress","_t":1784254569771,"id":"1","progress":0.500828402366864,"total":2428,"current":523} -{"_e":"metro:bundling:progress","_t":1784254569871,"id":"1","progress":0.500828402366864,"total":2454,"current":542} -{"_e":"metro:bundling:progress","_t":1784254569971,"id":"1","progress":0.500828402366864,"total":2465,"current":563} -{"_e":"metro:bundling:progress","_t":1784254570071,"id":"1","progress":0.500828402366864,"total":2477,"current":583} -{"_e":"metro:bundling:progress","_t":1784254570173,"id":"1","progress":0.500828402366864,"total":2478,"current":625} -{"_e":"metro:bundling:progress","_t":1784254570273,"id":"1","progress":0.500828402366864,"total":2478,"current":677} -{"_e":"metro:bundling:progress","_t":1784254570374,"id":"1","progress":0.500828402366864,"total":2478,"current":727} -{"_e":"metro:bundling:progress","_t":1784254570474,"id":"1","progress":0.500828402366864,"total":2478,"current":772} -{"_e":"metro:bundling:progress","_t":1784254570574,"id":"1","progress":0.500828402366864,"total":2478,"current":818} -{"_e":"metro:bundling:progress","_t":1784254570674,"id":"1","progress":0.500828402366864,"total":2478,"current":863} -{"_e":"metro:bundling:progress","_t":1784254570774,"id":"1","progress":0.500828402366864,"total":2478,"current":912} -{"_e":"metro:bundling:progress","_t":1784254570874,"id":"1","progress":0.500828402366864,"total":2478,"current":965} -{"_e":"metro:bundling:progress","_t":1784254570974,"id":"1","progress":0.500828402366864,"total":2478,"current":1008} -{"_e":"metro:bundling:progress","_t":1784254571076,"id":"1","progress":0.500828402366864,"total":2478,"current":1056} -{"_e":"metro:bundling:progress","_t":1784254571176,"id":"1","progress":0.500828402366864,"total":2478,"current":1105} -{"_e":"metro:bundling:progress","_t":1784254571277,"id":"1","progress":0.500828402366864,"total":2478,"current":1160} -{"_e":"metro:bundling:progress","_t":1784254571377,"id":"1","progress":0.500828402366864,"total":2478,"current":1209} -{"_e":"metro:bundling:progress","_t":1784254571478,"id":"1","progress":0.500828402366864,"total":2478,"current":1264} -{"_e":"metro:bundling:progress","_t":1784254571578,"id":"1","progress":0.500828402366864,"total":2478,"current":1311} -{"_e":"metro:bundling:progress","_t":1784254571678,"id":"1","progress":0.500828402366864,"total":2478,"current":1357} -{"_e":"metro:bundling:progress","_t":1784254571778,"id":"1","progress":0.500828402366864,"total":2478,"current":1410} -{"_e":"metro:bundling:progress","_t":1784254571878,"id":"1","progress":0.500828402366864,"total":2478,"current":1461} -{"_e":"metro:bundling:progress","_t":1784254571978,"id":"1","progress":0.500828402366864,"total":2478,"current":1507} -{"_e":"metro:bundling:progress","_t":1784254572078,"id":"1","progress":0.500828402366864,"total":2478,"current":1560} -{"_e":"metro:bundling:progress","_t":1784254572178,"id":"1","progress":0.500828402366864,"total":2478,"current":1611} -{"_e":"metro:bundling:progress","_t":1784254572279,"id":"1","progress":0.500828402366864,"total":2478,"current":1668} -{"_e":"metro:bundling:progress","_t":1784254572379,"id":"1","progress":0.500828402366864,"total":2478,"current":1721} -{"_e":"metro:bundling:progress","_t":1784254572480,"id":"1","progress":0.5136689550856253,"total":2478,"current":1776} -{"_e":"metro:bundling:progress","_t":1784254572580,"id":"1","progress":0.5394363050209071,"total":2478,"current":1820} -{"_e":"metro:bundling:progress","_t":1784254572681,"id":"1","progress":0.5737542838642687,"total":2478,"current":1877} -{"_e":"metro:bundling:progress","_t":1784254572781,"id":"1","progress":0.6047290409029646,"total":2478,"current":1927} -{"_e":"metro:bundling:progress","_t":1784254572881,"id":"1","progress":0.6397417532559323,"total":2478,"current":1982} -{"_e":"metro:bundling:progress","_t":1784254572981,"id":"1","progress":0.6737507987969679,"total":2478,"current":2034} -{"_e":"metro:bundling:progress","_t":1784254573081,"id":"1","progress":0.7106802981654216,"total":2478,"current":2089} -{"_e":"metro:bundling:progress","_t":1784254573181,"id":"1","progress":0.7506914764373623,"total":2478,"current":2147} -{"_e":"metro:bundling:progress","_t":1784254573281,"id":"1","progress":0.782489458485683,"total":2478,"current":2192} -{"_e":"metro:bundling:progress","_t":1784254573382,"id":"1","progress":0.822981380620811,"total":2478,"current":2248} -{"_e":"metro:bundling:progress","_t":1784254573483,"id":"1","progress":0.8637444540202369,"total":2478,"current":2303} -{"_e":"metro:bundling:progress","_t":1784254573583,"id":"1","progress":0.8846124232278917,"total":2489,"current":2341} -{"_e":"metro:bundling:progress","_t":1784254573683,"id":"1","progress":0.8880743173619988,"total":2499,"current":2355} -{"_e":"metro:bundling:progress","_t":1784254573786,"id":"1","progress":0.8880743173619988,"total":2589,"current":2373} -{"_e":"metro:bundling:progress","_t":1784254573886,"id":"1","progress":0.8880743173619988,"total":2601,"current":2399} -{"_e":"metro:bundling:progress","_t":1784254573987,"id":"1","progress":0.8880743173619988,"total":2602,"current":2410} -{"_e":"metro:bundling:progress","_t":1784254574087,"id":"1","progress":0.8880743173619988,"total":2614,"current":2424} -{"_e":"metro:bundling:progress","_t":1784254574188,"id":"1","progress":0.8880743173619988,"total":2617,"current":2444} -{"_e":"metro:bundling:progress","_t":1784254574288,"id":"1","progress":0.8880743173619988,"total":2619,"current":2451} -{"_e":"metro:bundling:progress","_t":1784254574388,"id":"1","progress":0.8880743173619988,"total":2621,"current":2455} -{"_e":"metro:bundling:progress","_t":1784254574488,"id":"1","progress":0.8880743173619988,"total":2625,"current":2462} -{"_e":"metro:bundling:progress","_t":1784254574588,"id":"1","progress":0.8880743173619988,"total":2631,"current":2469} -{"_e":"metro:bundling:progress","_t":1784254574688,"id":"1","progress":0.8880743173619988,"total":2636,"current":2474} -{"_e":"metro:bundling:progress","_t":1784254574844,"id":"1","progress":0.8880743173619988,"total":2640,"current":2481} -{"_e":"metro:bundling:progress","_t":1784254574944,"id":"1","progress":0.8880743173619988,"total":2649,"current":2493} -{"_e":"metro:bundling:progress","_t":1784254575044,"id":"1","progress":0.8880743173619988,"total":2700,"current":2508} -{"_e":"metro:bundling:progress","_t":1784254575144,"id":"1","progress":0.8880743173619988,"total":2707,"current":2526} -{"_e":"metro:bundling:progress","_t":1784254575245,"id":"1","progress":0.8880743173619988,"total":2713,"current":2534} -{"_e":"metro:bundling:progress","_t":1784254575345,"id":"1","progress":0.8880743173619988,"total":2778,"current":2556} -{"_e":"metro:bundling:progress","_t":1784254575447,"id":"1","progress":0.8880743173619988,"total":2786,"current":2569} -{"_e":"metro:bundling:progress","_t":1784254575547,"id":"1","progress":0.8880743173619988,"total":2787,"current":2572} -{"_e":"metro:bundling:progress","_t":1784254575647,"id":"1","progress":0.8880743173619988,"total":2787,"current":2574} -{"_e":"metro:bundling:progress","_t":1784254575778,"id":"1","progress":0.8880743173619988,"total":2787,"current":2575} -{"_e":"metro:bundling:progress","_t":1784254575878,"id":"1","progress":0.8880743173619988,"total":2789,"current":2582} -{"_e":"metro:bundling:progress","_t":1784254575980,"id":"1","progress":0.8880743173619988,"total":2789,"current":2593} -{"_e":"metro:bundling:progress","_t":1784254576082,"id":"1","progress":0.8880743173619988,"total":2799,"current":2612} -{"_e":"metro:bundling:progress","_t":1784254576182,"id":"1","progress":0.8880743173619988,"total":2813,"current":2637} -{"_e":"metro:bundling:progress","_t":1784254576282,"id":"1","progress":0.8880743173619988,"total":2824,"current":2661} -{"_e":"metro:bundling:progress","_t":1784254576384,"id":"1","progress":0.9156393512217658,"total":2830,"current":2708} -{"_e":"metro:bundling:progress","_t":1784254576484,"id":"1","progress":0.9156393512217658,"total":2848,"current":2724} -{"_e":"metro:bundling:progress","_t":1784254576584,"id":"1","progress":0.9156393512217658,"total":2849,"current":2726} -{"_e":"metro:bundling:progress","_t":1784254576684,"id":"1","progress":0.9156393512217658,"total":2868,"current":2734} -{"_e":"metro:bundling:progress","_t":1784254576827,"id":"1","progress":0.9156393512217658,"total":2868,"current":2735} -{"_e":"metro:bundling:progress","_t":1784254576927,"id":"1","progress":0.9156393512217658,"total":2885,"current":2738} -{"_e":"metro:bundling:progress","_t":1784254577029,"id":"1","progress":0.9156393512217658,"total":2885,"current":2741} -{"_e":"metro:bundling:progress","_t":1784254577129,"id":"1","progress":0.9156393512217658,"total":2900,"current":2760} -{"_e":"metro:bundling:progress","_t":1784254577229,"id":"1","progress":0.9242757760075363,"total":2901,"current":2789} -{"_e":"metro:bundling:progress","_t":1784254577332,"id":"1","progress":0.936287891094404,"total":2903,"current":2809} -{"_e":"metro:bundling:progress","_t":1784254577435,"id":"1","progress":0.936287891094404,"total":2938,"current":2819} -{"_e":"metro:bundling:progress","_t":1784254577540,"id":"1","progress":0.936287891094404,"total":2986,"current":2825} -{"_e":"metro:bundling:progress","_t":1784254577642,"id":"1","progress":0.936287891094404,"total":3015,"current":2842} -{"_e":"metro:bundling:progress","_t":1784254577740,"id":"1","progress":0.936287891094404,"total":3030,"current":2856} -{"_e":"metro:bundling:progress","_t":1784254577840,"id":"1","progress":0.936287891094404,"total":3035,"current":2860} -{"_e":"metro:bundling:progress","_t":1784254577940,"id":"1","progress":0.936287891094404,"total":3044,"current":2871} -{"_e":"metro:bundling:progress","_t":1784254578041,"id":"1","progress":0.936287891094404,"total":3047,"current":2879} -{"_e":"metro:bundling:progress","_t":1784254578141,"id":"1","progress":0.936287891094404,"total":3065,"current":2890} -{"_e":"metro:bundling:progress","_t":1784254578241,"id":"1","progress":0.936287891094404,"total":3080,"current":2900} -{"_e":"metro:bundling:progress","_t":1784254578342,"id":"1","progress":0.936287891094404,"total":3082,"current":2913} -{"_e":"metro:bundling:progress","_t":1784254578442,"id":"1","progress":0.936287891094404,"total":3082,"current":2928} -{"_e":"metro:bundling:progress","_t":1784254578543,"id":"1","progress":0.936287891094404,"total":3089,"current":2949} -{"_e":"metro:bundling:progress","_t":1784254578642,"id":"1","progress":0.936287891094404,"total":3096,"current":2973} -{"_e":"metro:bundling:progress","_t":1784254578742,"id":"1","progress":0.936287891094404,"total":3114,"current":2999} -{"_e":"metro:bundling:progress","_t":1784254578843,"id":"1","progress":0.936287891094404,"total":3114,"current":3002} -{"_e":"metro:bundling:progress","_t":1784254578943,"id":"1","progress":0.936287891094404,"total":3123,"current":3009} -{"_e":"metro:bundling:progress","_t":1784254579045,"id":"1","progress":0.936287891094404,"total":3123,"current":3011} -{"_e":"metro:bundling:progress","_t":1784254579064,"id":"1","progress":0.936287891094404,"total":3123,"current":3012} -{"_e":"metro:bundling:progress","_t":1784254579164,"id":"1","progress":0.936287891094404,"total":3131,"current":3025} -{"_e":"metro:bundling:progress","_t":1784254579265,"id":"1","progress":0.9365842200881371,"total":3134,"current":3033} -{"_e":"metro:bundling:progress","_t":1784254579367,"id":"1","progress":0.9368419128824654,"total":3147,"current":3046} -{"_e":"metro:bundling:progress","_t":1784254579468,"id":"1","progress":0.9387456790123457,"total":3150,"current":3052} -{"_e":"metro:bundling:progress","_t":1784254579568,"id":"1","progress":0.9393609473418997,"total":3150,"current":3053} -{"_e":"metro:bundling:progress","_t":1784254579682,"id":"1","progress":0.9412079617031998,"total":3150,"current":3056} -{"_e":"metro:bundling:progress","_t":1784254579782,"id":"1","progress":0.9430567901234569,"total":3150,"current":3059} -{"_e":"metro:bundling:progress","_t":1784254579883,"id":"1","progress":0.9473777777777779,"total":3150,"current":3066} -{"_e":"metro:bundling:progress","_t":1784254579989,"id":"1","progress":0.9529773417570666,"total":3152,"current":3077} -{"_e":"metro:bundling:progress","_t":1784254580089,"id":"1","progress":0.9549354307189066,"total":3159,"current":3087} -{"_e":"metro:bundling:progress","_t":1784254580189,"id":"1","progress":0.9686047908988945,"total":3160,"current":3110} -{"_e":"metro:bundling:progress","_t":1784254580292,"id":"1","progress":0.9717926782024794,"total":3168,"current":3123} -{"_e":"metro:bundling:progress","_t":1784254580392,"id":"1","progress":0.9767778200247423,"total":3168,"current":3131} -{"_e":"metro:bundling:progress","_t":1784254580502,"id":"1","progress":0.9768938323842832,"total":3184,"current":3147} -{"_e":"metro:bundling:progress","_t":1784254580608,"id":"1","progress":0.9769943965134558,"total":3198,"current":3161} -{"_e":"metro:bundling:progress","_t":1784254580709,"id":"1","progress":0.9769943965134558,"total":3220,"current":3182} -{"_e":"metro:bundling:progress","_t":1784254580809,"id":"1","progress":0.9791352776121244,"total":3242,"current":3208} -{"_e":"metro:bundling:progress","_t":1784254580909,"id":"1","progress":0.9791352776121244,"total":3272,"current":3232} -{"_e":"metro:bundling:progress","_t":1784254581010,"id":"1","progress":0.9848326177487721,"total":3284,"current":3259} -{"_e":"metro:bundling:progress","_t":1784254581111,"id":"1","progress":0.999,"total":3291,"current":3290} -{"_e":"metro:bundling:progress","_t":1784254581211,"id":"1","progress":0.999,"total":3291,"current":3291} -{"_e":"metro:bundling:done","_t":1784254581468,"id":"1","total":3291,"ms":16753.428873} -{"_e":"metro:client_log","_t":1784254596888,"level":"warn","data":["SafeAreaView has been deprecated and will be removed in a future release. Please use 'react-native-safe-area-context' instead. See https://github.com/AppAndFlow/react-native-safe-area-context"]} -{"_e":"metro:bundling:started","_t":1784254612886,"id":"3","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784254612886,"id":"3","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784254612993,"id":"3","total":1,"ms":107.061183} -{"_e":"metro:client_log","_t":1784254630240,"level":"warn","data":["SafeAreaView has been deprecated and will be removed in a future release. Please use 'react-native-safe-area-context' instead. See https://github.com/AppAndFlow/react-native-safe-area-context"]} -{"_e":"metro:client_log","_t":1784254721520,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784254774528,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784254928412,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:bundling:started","_t":1784256200326,"id":"7","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784256200326,"id":"7","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784256200332,"id":"7","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784256200434,"id":"7","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784256200538,"id":"7","total":1,"ms":211.987279} -{"_e":"metro:client_log","_t":1784256223781,"level":"warn","data":["SafeAreaView has been deprecated and will be removed in a future release. Please use 'react-native-safe-area-context' instead. See https://github.com/AppAndFlow/react-native-safe-area-context"]} -{"_e":"metro:client_log","_t":1784256310429,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784256369062,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784256387012,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784256420271,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:bundling:started","_t":1784258596497,"id":"9","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784258596520,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258596532,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258596843,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597094,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597194,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597294,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597394,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597494,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597594,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597694,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597809,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258597925,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784258598025,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784258598321,"id":"9","total":1,"ms":1802.095472} -{"_e":"metro:client_log","_t":1784258647493,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:bundling:started","_t":1784261637702,"id":"b","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784261637702,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784261637708,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784261637808,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784261638016,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784261638197,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784261638447,"id":"b","total":1,"ms":744.986372} -{"_e":"metro:client_log","_t":1784261670156,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:client_log","_t":1784261697357,"level":"warn","data":["[expo-image-picker] `ImagePicker.MediaTypeOptions` have been deprecated. Use `ImagePicker.MediaType` or an array of `ImagePicker.MediaType` instead."]} -{"_e":"metro:bundling:started","_t":1784263415011,"id":"d","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784263415013,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784263415016,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784263415116,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784263415858,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784263416167,"id":"d","total":1,"ms":1153.731646} -{"_e":"metro:bundling:started","_t":1784266840468,"id":"f","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784266840469,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266840484,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266840743,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266840992,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841361,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841461,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841561,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841661,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841761,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841861,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266841961,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266842061,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266842173,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266842275,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266842846,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266843171,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266843304,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266843413,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266844439,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266844538,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266844818,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266844918,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266844939,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845040,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845141,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845241,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845341,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845443,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845546,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784266845580,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784266846113,"id":"f","total":1,"ms":5644.099564} -{"_e":"metro:client_log","_t":1784266851912,"level":"error","data":["[TypeError: undefined is not a function]"]} -{"_e":"root:init","_t":1784293044660,"format":"v0-jsonl","version":"57.0.8"} -{"_e":"env:mode","_t":1784293044688,"nodeEnv":"development","babelEnv":"development","mode":"development"} -{"_e":"env:load","_t":1784293044699,"mode":"development","files":[],"env":{}} -{"_e":"devserver:start","_t":1784293048866,"mode":"development","web":true,"baseUrl":"","asyncRoutes":false,"routerRoot":"../../../app","serverComponents":false,"serverActions":false,"serverRendering":false,"apiRoutes":false,"exporting":false} -{"_e":"metro:config","_t":1784293054547,"serverRoot":"../../..","projectRoot":"../../..","exporting":false,"flags":{"autolinkingModuleResolution":false,"serverActions":false,"serverComponents":false,"reactCompiler":false,"optimizeGraph":false,"treeshaking":false,"logbox":false}} -{"_e":"expo:dev-tools-plugin:load","_t":1784293056345,"plugins":[]} -{"_e":"metro:instantiate","_t":1784293066659,"atlas":false,"workers":6,"host":"::","port":8081} -{"_e":"metro:bundling:started","_t":1784293282277,"id":"1","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784293282278,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784293282305,"id":"1","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784293284527,"id":"1","progress":0.010000000000000002,"total":1,"current":1} -{"_e":"metro:bundling:progress","_t":1784293284627,"id":"1","progress":0.09,"total":9,"current":3} -{"_e":"metro:bundling:progress","_t":1784293284739,"id":"1","progress":0.25,"total":12,"current":6} -{"_e":"metro:bundling:progress","_t":1784293284907,"id":"1","progress":0.34027777777777785,"total":12,"current":7} -{"_e":"metro:bundling:progress","_t":1784293285240,"id":"1","progress":0.4444444444444444,"total":12,"current":8} -{"_e":"metro:bundling:progress","_t":1784293285340,"id":"1","progress":0.4444444444444444,"total":60,"current":12} -{"_e":"metro:bundling:progress","_t":1784293285447,"id":"1","progress":0.4444444444444444,"total":60,"current":13} -{"_e":"metro:bundling:progress","_t":1784293285550,"id":"1","progress":0.4444444444444444,"total":65,"current":19} -{"_e":"metro:bundling:progress","_t":1784293285649,"id":"1","progress":0.4444444444444444,"total":77,"current":41} -{"_e":"metro:bundling:progress","_t":1784293285750,"id":"1","progress":0.4444444444444444,"total":94,"current":52} -{"_e":"metro:bundling:progress","_t":1784293285850,"id":"1","progress":0.4444444444444444,"total":123,"current":67} -{"_e":"metro:bundling:progress","_t":1784293285950,"id":"1","progress":0.4444444444444444,"total":133,"current":83} -{"_e":"metro:bundling:progress","_t":1784293286050,"id":"1","progress":0.4444444444444444,"total":155,"current":92} -{"_e":"metro:bundling:progress","_t":1784293286155,"id":"1","progress":0.4444444444444444,"total":186,"current":105} -{"_e":"metro:bundling:progress","_t":1784293286255,"id":"1","progress":0.4444444444444444,"total":186,"current":110} -{"_e":"metro:bundling:progress","_t":1784293286355,"id":"1","progress":0.4444444444444444,"total":193,"current":119} -{"_e":"metro:bundling:progress","_t":1784293286471,"id":"1","progress":0.4444444444444444,"total":200,"current":129} -{"_e":"metro:bundling:progress","_t":1784293286534,"id":"1","progress":0.4444444444444444,"total":200,"current":130} -{"_e":"metro:bundling:progress","_t":1784293286653,"id":"1","progress":0.4444444444444444,"total":232,"current":142} -{"_e":"metro:bundling:progress","_t":1784293286753,"id":"1","progress":0.4444444444444444,"total":328,"current":149} -{"_e":"metro:bundling:progress","_t":1784293286928,"id":"1","progress":0.4444444444444444,"total":328,"current":150} -{"_e":"metro:bundling:progress","_t":1784293287051,"id":"1","progress":0.4444444444444444,"total":2077,"current":151} -{"_e":"metro:bundling:progress","_t":1784293287151,"id":"1","progress":0.4444444444444444,"total":2091,"current":183} -{"_e":"metro:bundling:progress","_t":1784293287251,"id":"1","progress":0.4444444444444444,"total":2105,"current":198} -{"_e":"metro:bundling:progress","_t":1784293287351,"id":"1","progress":0.4444444444444444,"total":2172,"current":215} -{"_e":"metro:bundling:progress","_t":1784293287465,"id":"1","progress":0.4444444444444444,"total":2225,"current":237} -{"_e":"metro:bundling:progress","_t":1784293287568,"id":"1","progress":0.4444444444444444,"total":2248,"current":253} -{"_e":"metro:bundling:progress","_t":1784293287668,"id":"1","progress":0.4444444444444444,"total":2271,"current":275} -{"_e":"metro:bundling:progress","_t":1784293287768,"id":"1","progress":0.4444444444444444,"total":2309,"current":306} -{"_e":"metro:bundling:progress","_t":1784293287868,"id":"1","progress":0.4444444444444444,"total":2322,"current":326} -{"_e":"metro:bundling:progress","_t":1784293287990,"id":"1","progress":0.4444444444444444,"total":2322,"current":327} -{"_e":"metro:bundling:progress","_t":1784293288090,"id":"1","progress":0.4444444444444444,"total":2326,"current":368} -{"_e":"metro:bundling:progress","_t":1784293288198,"id":"1","progress":0.4444444444444444,"total":2326,"current":410} -{"_e":"metro:bundling:progress","_t":1784293288305,"id":"1","progress":0.4444444444444444,"total":2326,"current":438} -{"_e":"metro:bundling:progress","_t":1784293288405,"id":"1","progress":0.4444444444444444,"total":2326,"current":466} -{"_e":"metro:bundling:progress","_t":1784293288506,"id":"1","progress":0.4444444444444444,"total":2326,"current":531} -{"_e":"metro:bundling:progress","_t":1784293288606,"id":"1","progress":0.4444444444444444,"total":2326,"current":588} -{"_e":"metro:bundling:progress","_t":1784293288707,"id":"1","progress":0.4444444444444444,"total":2326,"current":647} -{"_e":"metro:bundling:progress","_t":1784293288807,"id":"1","progress":0.4444444444444444,"total":2326,"current":713} -{"_e":"metro:bundling:progress","_t":1784293288908,"id":"1","progress":0.4444444444444444,"total":2326,"current":780} -{"_e":"metro:bundling:progress","_t":1784293289008,"id":"1","progress":0.4444444444444444,"total":2326,"current":850} -{"_e":"metro:bundling:progress","_t":1784293289108,"id":"1","progress":0.4444444444444444,"total":2326,"current":907} -{"_e":"metro:bundling:progress","_t":1784293289211,"id":"1","progress":0.4444444444444444,"total":2326,"current":969} -{"_e":"metro:bundling:progress","_t":1784293289311,"id":"1","progress":0.4444444444444444,"total":2326,"current":1040} -{"_e":"metro:bundling:progress","_t":1784293289411,"id":"1","progress":0.4444444444444444,"total":2326,"current":1108} -{"_e":"metro:bundling:progress","_t":1784293289511,"id":"1","progress":0.4444444444444444,"total":2326,"current":1179} -{"_e":"metro:bundling:progress","_t":1784293289611,"id":"1","progress":0.4444444444444444,"total":2326,"current":1239} -{"_e":"metro:bundling:progress","_t":1784293289711,"id":"1","progress":0.4444444444444444,"total":2326,"current":1307} -{"_e":"metro:bundling:progress","_t":1784293289811,"id":"1","progress":0.4444444444444444,"total":2326,"current":1375} -{"_e":"metro:bundling:progress","_t":1784293289911,"id":"1","progress":0.4444444444444444,"total":2326,"current":1447} -{"_e":"metro:bundling:progress","_t":1784293290011,"id":"1","progress":0.4444444444444444,"total":2326,"current":1508} -{"_e":"metro:bundling:progress","_t":1784293290111,"id":"1","progress":0.4614182344856344,"total":2326,"current":1580} -{"_e":"metro:bundling:progress","_t":1784293290211,"id":"1","progress":0.49289333852838557,"total":2326,"current":1633} -{"_e":"metro:bundling:progress","_t":1784293290311,"id":"1","progress":0.5347973005443715,"total":2326,"current":1701} -{"_e":"metro:bundling:progress","_t":1784293290412,"id":"1","progress":0.5738420738609268,"total":2326,"current":1762} -{"_e":"metro:bundling:progress","_t":1784293290512,"id":"1","progress":0.6115697239845065,"total":2326,"current":1819} -{"_e":"metro:bundling:progress","_t":1784293290613,"id":"1","progress":0.6665465865327388,"total":2326,"current":1899} -{"_e":"metro:bundling:progress","_t":1784293290713,"id":"1","progress":0.7100561967633445,"total":2326,"current":1960} -{"_e":"metro:bundling:progress","_t":1784293290813,"id":"1","progress":0.7594305724883536,"total":2326,"current":2027} -{"_e":"metro:bundling:progress","_t":1784293290913,"id":"1","progress":0.7974657485960396,"total":2346,"current":2095} -{"_e":"metro:bundling:progress","_t":1784293291013,"id":"1","progress":0.7974657485960396,"total":2415,"current":2124} -{"_e":"metro:bundling:progress","_t":1784293291115,"id":"1","progress":0.7974657485960396,"total":2472,"current":2162} -{"_e":"metro:bundling:progress","_t":1784293291215,"id":"1","progress":0.7974657485960396,"total":2474,"current":2174} -{"_e":"metro:bundling:progress","_t":1784293291315,"id":"1","progress":0.7974657485960396,"total":2519,"current":2215} -{"_e":"metro:bundling:progress","_t":1784293291416,"id":"1","progress":0.7974657485960396,"total":2536,"current":2243} -{"_e":"metro:bundling:progress","_t":1784293291519,"id":"1","progress":0.7974657485960396,"total":2569,"current":2280} -{"_e":"metro:bundling:progress","_t":1784293291628,"id":"1","progress":0.7974657485960396,"total":2606,"current":2318} -{"_e":"metro:bundling:progress","_t":1784293291728,"id":"1","progress":0.7974657485960396,"total":2659,"current":2329} -{"_e":"metro:bundling:progress","_t":1784293291831,"id":"1","progress":0.7974657485960396,"total":2675,"current":2348} -{"_e":"metro:bundling:progress","_t":1784293291931,"id":"1","progress":0.7974657485960396,"total":2687,"current":2378} -{"_e":"metro:bundling:progress","_t":1784293292033,"id":"1","progress":0.7974657485960396,"total":2707,"current":2408} -{"_e":"metro:bundling:progress","_t":1784293292133,"id":"1","progress":0.8159888890401819,"total":2710,"current":2448} -{"_e":"metro:bundling:progress","_t":1784293292234,"id":"1","progress":0.8444485836968604,"total":2714,"current":2494} -{"_e":"metro:bundling:progress","_t":1784293292333,"id":"1","progress":0.864934254482803,"total":2715,"current":2525} -{"_e":"metro:bundling:progress","_t":1784293292433,"id":"1","progress":0.8762830037348633,"total":2723,"current":2549} -{"_e":"metro:bundling:progress","_t":1784293292536,"id":"1","progress":0.8864205287942541,"total":2735,"current":2575} -{"_e":"metro:bundling:progress","_t":1784293292636,"id":"1","progress":0.8979424496100379,"total":2748,"current":2604} -{"_e":"metro:bundling:progress","_t":1784293292736,"id":"1","progress":0.9052557235874816,"total":2760,"current":2626} -{"_e":"metro:bundling:progress","_t":1784293292836,"id":"1","progress":0.9052557235874816,"total":2779,"current":2637} -{"_e":"metro:bundling:progress","_t":1784293292936,"id":"1","progress":0.9052557235874816,"total":2808,"current":2645} -{"_e":"metro:bundling:progress","_t":1784293293039,"id":"1","progress":0.9052557235874816,"total":2817,"current":2655} -{"_e":"metro:bundling:progress","_t":1784293293138,"id":"1","progress":0.9052557235874816,"total":2833,"current":2669} -{"_e":"metro:bundling:progress","_t":1784293293239,"id":"1","progress":0.9052557235874816,"total":2843,"current":2686} -{"_e":"metro:bundling:progress","_t":1784293293339,"id":"1","progress":0.9052557235874816,"total":2851,"current":2705} -{"_e":"metro:bundling:progress","_t":1784293293439,"id":"1","progress":0.9066178148700104,"total":2864,"current":2727} -{"_e":"metro:bundling:progress","_t":1784293293541,"id":"1","progress":0.9148469566887284,"total":2872,"current":2747} -{"_e":"metro:bundling:progress","_t":1784293293641,"id":"1","progress":0.9148469566887284,"total":2901,"current":2764} -{"_e":"metro:bundling:progress","_t":1784293293742,"id":"1","progress":0.9148469566887284,"total":2901,"current":2767} -{"_e":"metro:bundling:progress","_t":1784293293842,"id":"1","progress":0.9148469566887284,"total":2913,"current":2773} -{"_e":"metro:bundling:progress","_t":1784293293942,"id":"1","progress":0.9148469566887284,"total":2914,"current":2775} -{"_e":"metro:bundling:progress","_t":1784293294081,"id":"1","progress":0.9148469566887284,"total":2915,"current":2779} -{"_e":"metro:bundling:progress","_t":1784293294182,"id":"1","progress":0.9148469566887284,"total":2928,"current":2791} -{"_e":"metro:bundling:progress","_t":1784293294282,"id":"1","progress":0.9148469566887284,"total":2949,"current":2805} -{"_e":"metro:bundling:progress","_t":1784293294382,"id":"1","progress":0.9148469566887284,"total":2955,"current":2815} -{"_e":"metro:bundling:progress","_t":1784293294482,"id":"1","progress":0.9148469566887284,"total":2998,"current":2824} -{"_e":"metro:bundling:progress","_t":1784293294582,"id":"1","progress":0.9148469566887284,"total":3048,"current":2844} -{"_e":"metro:bundling:progress","_t":1784293294682,"id":"1","progress":0.9148469566887284,"total":3050,"current":2853} -{"_e":"metro:bundling:progress","_t":1784293294783,"id":"1","progress":0.9148469566887284,"total":3071,"current":2877} -{"_e":"metro:bundling:progress","_t":1784293294884,"id":"1","progress":0.9148469566887284,"total":3091,"current":2891} -{"_e":"metro:bundling:progress","_t":1784293294988,"id":"1","progress":0.9148469566887284,"total":3097,"current":2900} -{"_e":"metro:bundling:progress","_t":1784293295088,"id":"1","progress":0.9148469566887284,"total":3108,"current":2914} -{"_e":"metro:bundling:progress","_t":1784293295188,"id":"1","progress":0.9148469566887284,"total":3121,"current":2926} -{"_e":"metro:bundling:progress","_t":1784293295288,"id":"1","progress":0.9148469566887284,"total":3123,"current":2935} -{"_e":"metro:bundling:progress","_t":1784293295389,"id":"1","progress":0.9148469566887284,"total":3123,"current":2937} -{"_e":"metro:bundling:progress","_t":1784293295489,"id":"1","progress":0.9148469566887284,"total":3123,"current":2943} -{"_e":"metro:bundling:progress","_t":1784293295589,"id":"1","progress":0.9148469566887284,"total":3124,"current":2952} -{"_e":"metro:bundling:progress","_t":1784293295689,"id":"1","progress":0.9148469566887284,"total":3125,"current":2974} -{"_e":"metro:bundling:progress","_t":1784293295789,"id":"1","progress":0.9148469566887284,"total":3125,"current":2987} -{"_e":"metro:bundling:progress","_t":1784293295892,"id":"1","progress":0.9198330727820985,"total":3128,"current":3000} -{"_e":"metro:bundling:progress","_t":1784293295992,"id":"1","progress":0.9299565847185871,"total":3141,"current":3029} -{"_e":"metro:bundling:progress","_t":1784293296094,"id":"1","progress":0.9492962002534049,"total":3154,"current":3073} -{"_e":"metro:bundling:progress","_t":1784293296194,"id":"1","progress":0.9629720079436931,"total":3157,"current":3098} -{"_e":"metro:bundling:progress","_t":1784293296294,"id":"1","progress":0.9629720079436931,"total":3173,"current":3108} -{"_e":"metro:bundling:progress","_t":1784293296394,"id":"1","progress":0.9629720079436931,"total":3185,"current":3124} -{"_e":"metro:bundling:progress","_t":1784293296494,"id":"1","progress":0.9648012926893179,"total":3210,"current":3153} -{"_e":"metro:bundling:progress","_t":1784293296594,"id":"1","progress":0.9747663656275425,"total":3229,"current":3188} -{"_e":"metro:bundling:progress","_t":1784293296694,"id":"1","progress":0.9834384092814489,"total":3247,"current":3220} -{"_e":"metro:bundling:progress","_t":1784293296794,"id":"1","progress":0.9834384092814489,"total":3286,"current":3254} -{"_e":"metro:bundling:progress","_t":1784293296903,"id":"1","progress":0.999,"total":3300,"current":3300} -{"_e":"metro:bundling:done","_t":1784293297284,"id":"1","total":3300,"ms":15006.607121} -{"_e":"metro:client_log","_t":1784293311557,"level":"error","data":["[Error: [Reanimated] Failed to find host instance for a ref.]","\n\n\u001b[1mCall Stack\u001b[22m\n\u001b[2m\u001b[90m SkiaPictureView (\u001b]8;;\u0007\u001b]8;;\u0007)\u001b[39m\u001b[22m\n\u001b[2m\u001b[90m Canvas (\u001b]8;;http:/192.168.1.25:8081/index.ts.bundle\u0007http:/192.168.1.25:8081/index.ts.bundle\u001b]8;;\u0007)\u001b[39m\u001b[22m"]} -{"_e":"metro:bundling:started","_t":1784294061559,"id":"9","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784294061559,"id":"9","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784294061634,"id":"9","total":1,"ms":75.165257} -{"_e":"metro:bundling:started","_t":1784295273557,"id":"b","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784295273557,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784295273562,"id":"b","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784295273724,"id":"b","total":1,"ms":167.330607} -{"_e":"metro:bundling:started","_t":1784296589113,"id":"d","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784296589113,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589124,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589255,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589338,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589438,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589538,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589638,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589738,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589852,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296589952,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296590056,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296590156,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296590256,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784296590304,"id":"d","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784296590410,"id":"d","total":1,"ms":1297.260922} -{"_e":"metro:bundling:started","_t":1784296639397,"id":"e","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784296639397,"id":"e","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784296639495,"id":"e","total":1,"ms":97.436217} -{"_e":"metro:bundling:started","_t":1784299195451,"id":"f","platform":"android","environment":null,"entry":"index.ts"} -{"_e":"metro:bundling:progress","_t":1784299195476,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:progress","_t":1784299195479,"id":"f","progress":0,"total":1,"current":0} -{"_e":"metro:bundling:done","_t":1784299196005,"id":"f","total":1,"ms":529.887212} diff --git a/.expo/devices.json b/.expo/devices.json deleted file mode 100644 index 72b92ba..0000000 --- a/.expo/devices.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "devices": [ - { - "installationId": "3ac39ffb-519e-4fcd-b686-c20d0a63c449", - "lastUsed": 1784299195276 - } - ] -} diff --git a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_108.png b/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_108.png deleted file mode 100644 index 1e9b3d1..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_108.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_162.png b/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_162.png deleted file mode 100644 index c02225f..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_162.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_216.png b/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_216.png deleted file mode 100644 index dde133a..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_216.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_324.png b/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_324.png deleted file mode 100644 index 55a3581..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_324.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_432.png b/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_432.png deleted file mode 100644 index d190cdd..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-background/android-adaptive-background-fb139c2dee362ebf2070e23b96da6fc0d43f8492de38b8af1fd7223e19b5861d-cover-transparent/icon_432.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_108.png b/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_108.png deleted file mode 100644 index 46ea7d0..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_108.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_162.png b/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_162.png deleted file mode 100644 index 49a260f..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_162.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_216.png b/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_216.png deleted file mode 100644 index 671b75f..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_216.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_324.png b/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_324.png deleted file mode 100644 index ba86612..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_324.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_432.png b/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_432.png deleted file mode 100644 index 3468026..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-foreground/android-adaptive-foreground-9e3d0315a33c6799de601dd34cd8bf8cc3a8d16f3bf75592baec2ceb7240b391-cover-transparent/icon_432.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_108.png b/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_108.png deleted file mode 100644 index 12a3278..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_108.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_162.png b/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_162.png deleted file mode 100644 index fc1087b..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_162.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_216.png b/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_216.png deleted file mode 100644 index 2809d31..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_216.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_324.png b/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_324.png deleted file mode 100644 index 9dbe470..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_324.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_432.png b/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_432.png deleted file mode 100644 index 8736a27..0000000 Binary files a/.expo/web/cache/production/images/android-adaptive-monochrome/android-adaptive-monochrome-6371fc2c12e33ad2215a86c281db3d682a81bebe7c957a842c13b8bf00cceb83-cover-transparent/icon_432.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png b/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png deleted file mode 100644 index f244920..0000000 Binary files a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png b/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png deleted file mode 100644 index ecf996c..0000000 Binary files a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png b/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png deleted file mode 100644 index 1d7f21b..0000000 Binary files a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png b/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png deleted file mode 100644 index 26e9ee9..0000000 Binary files a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png b/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png deleted file mode 100644 index 8cc40ae..0000000 Binary files a/.expo/web/cache/production/images/android-standard-circle/android-standard-circle-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png b/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png deleted file mode 100644 index 4f048f1..0000000 Binary files a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_144.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png b/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png deleted file mode 100644 index 2d402bc..0000000 Binary files a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_192.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png b/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png deleted file mode 100644 index 73035e1..0000000 Binary files a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_48.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png b/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png deleted file mode 100644 index 36413a3..0000000 Binary files a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_72.png and /dev/null differ diff --git a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png b/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png deleted file mode 100644 index 2db6d9d..0000000 Binary files a/.expo/web/cache/production/images/android-standard-square/android-standard-square-119462bb78eb240a65c869fc067ee599639b3cb5a41953f25c07b17d2a8c7e0f-cover-transparent/icon_96.png and /dev/null differ diff --git a/.expo/web/cache/production/images/favicon/favicon-a4e030697a7571b3e95d31860e4da55d2f98e5e861e2b55e414f45a8556828ba-contain-transparent/favicon-48.png b/.expo/web/cache/production/images/favicon/favicon-a4e030697a7571b3e95d31860e4da55d2f98e5e861e2b55e414f45a8556828ba-contain-transparent/favicon-48.png deleted file mode 100644 index c612d28..0000000 Binary files a/.expo/web/cache/production/images/favicon/favicon-a4e030697a7571b3e95d31860e4da55d2f98e5e861e2b55e414f45a8556828ba-contain-transparent/favicon-48.png and /dev/null differ diff --git a/.gitignore b/.gitignore index 3c3629e..6d4ecab 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +.expo/ diff --git a/App.tsx b/App.tsx index bd01b18..a3a0821 100644 --- a/App.tsx +++ b/App.tsx @@ -13,23 +13,22 @@ import Viewfinder, { type ViewfinderHandle } from './src/components/Viewfinder'; import AdjustmentPanel from './src/components/AdjustmentPanel'; import CameraControls from './src/components/CameraControls'; import ToolRail, { TabId } from './src/components/ToolRail'; -import PreviewModal from './src/components/PreviewModal'; +import SettingsModal from './src/components/SettingsModal'; +import PhotoViewerModal from './src/components/PhotoViewerModal'; -import { Recipe, ColorAdjustments, FrameId, GPSInfo, AspectRatio } from './src/types'; +import { Recipe, ColorAdjustments, FrameId, GPSInfo, AspectRatio, MeterMode, PhotoEntry, ShutterSound } from './src/types'; import { getAllRecipes, saveCustomRecipe, deleteCustomRecipe } from './src/utils/storageUtils'; import { DEFAULT_ADJUSTMENTS } from './src/utils/defaultRecipes'; import { getCurrentGPS, requestLocationPermissions } from './src/utils/locationUtils'; import { resolvePhotoGPS } from './src/utils/photoGps'; import { processAndExportPhoto } from './src/utils/exportEngine'; +import { PARAM_DEFS } from './src/utils/paramDefs'; // @ts-ignore import './global.css'; const SESSION_KEY = 'saved_session'; -// DEBUG-4x3 (remove after diagnosis): build marker — prints once at JS eval. -console.error('[camdebug-ver] debug build console.error path'); - export default function App() { const [mode, setMode] = useState<'camera' | 'library'>('camera'); // Imperative handle into the Viewfinder camera controller: flushes the EV to @@ -48,14 +47,53 @@ export default function App() { // Composition aspect-ratio (FULL / 4:3 / 3:2 upright) + RAW DNG sidecar. const [aspectRatio, setAspectRatio] = useState('full'); const [rawEnabled, setRawEnabled] = useState(false); + // Full-frame metering mode (FOCUS → METERING MODE): highlight-weighted meters + // the BRIGHTEST area to protect its detail (never blow whites) and pushes the + // shadows very deep — extreme contrast (GR/Sony). Realised as: a small EV dip + // (capture headroom; NOT a full-frame dim), a highlight roll (keep bright + // detail), deep shadow crush and raised contrast/clarity. All constants are a + // starting approximation — tune after device testing. + const [meterMode, setMeterMode] = useState('evaluative'); + const METER_HL_EV = -0.5; + const METER_HL_HIGHLIGHT = -3; + const METER_HL_SHADOW = -4; + const METER_HL_CONTRAST = 3; + const METER_HL_CLARITY = 3; + const clampAdj = (v: number) => Math.max(-10, Math.min(10, v)); + const meteringActive = mode === 'camera' && meterMode === 'highlight'; + const meteringAdj: Partial | undefined = meteringActive + ? { + highlight: clampAdj((adjustments.highlight ?? 0) + METER_HL_HIGHLIGHT), + shadow: clampAdj((adjustments.shadow ?? 0) + METER_HL_SHADOW), + contrast: clampAdj((adjustments.contrast ?? 0) + METER_HL_CONTRAST), + clarity: clampAdj((adjustments.clarity ?? 0) + METER_HL_CLARITY), + } + : undefined; + // Same tonal overlay for the camera EXPORT (the EV dip is not inside — the + // hardware AE bias at capture already carries it, evFromCamera skips software + // EV, so folding the dip here would darken twice). + const renderAdj: ColorAdjustments = meteringAdj ? { ...adjustments, ...meteringAdj } : adjustments; const rawFailRef = useRef(false); // Progressive disclosure: a tool chip opens its panel; null = photo hero only. const [openTab, setOpenTab] = useState(null); + // The parameter whose slider row is open inside the panel — lifted here (not + // local to AdjustmentPanel) because an open row arms drag-anywhere-on-the- + // image adjustment in the Viewfinder. Cleared when the panel/tab closes. + const [openParamKey, setOpenParamKey] = useState(null); const [libraryImageUri, setLibraryImageUri] = useState(null); - const [lastPhotoUri, setLastPhotoUri] = useState(null); - const [lastSavedToLibrary, setLastSavedToLibrary] = useState(false); - const [previewVisible, setPreviewVisible] = useState(false); + // Session photo history (camera captures + library exports). The camera + // thumbnail/preview button shows the newest entry; the swipe viewer walks the + // whole list. Not persisted across restarts — entries are app-cache files. + const [photoHistory, setPhotoHistory] = useState([]); + // Index into photoHistory of the photo shown in the swipe viewer; null = closed. + const [viewerIndex, setViewerIndex] = useState(null); + // Gear sheet (sound / ratio / metering mode). Camera captures never auto-open + // the viewer anymore — the thumbnail button does. + const [settingsVisible, setSettingsVisible] = useState(false); + // Shutter click: only OFF/ON (no volume API on Android). Applied at capture. + const [shutterSound, setShutterSound] = useState('on'); + const photoSeq = useRef(0); const [isProcessing, setIsProcessing] = useState(false); // Hardware Permissions (vision-camera) @@ -96,6 +134,8 @@ export default function App() { selectedFrame, useGeotag, aspectRatio, + meterMode, + shutterSound, selectedRecipeId: selectedRecipe?.id || null, gpsInfo, }; @@ -107,7 +147,7 @@ export default function App() { } }); return () => subscription.remove(); - }, [mode, libraryImageUri, adjustments, selectedFrame, useGeotag, selectedRecipe, gpsInfo, aspectRatio]); + }, [mode, libraryImageUri, adjustments, selectedFrame, useGeotag, selectedRecipe, gpsInfo, aspectRatio, meterMode, shutterSound]); const initSession = async () => { const list = await getAllRecipes(); @@ -144,6 +184,8 @@ export default function App() { if (session.selectedFrame) setSelectedFrame(session.selectedFrame); if (session.useGeotag !== undefined) setUseGeotag(session.useGeotag); if (session.aspectRatio === '4:3' || session.aspectRatio === '3:2') setAspectRatio(session.aspectRatio); + if (session.meterMode === 'evaluative' || session.meterMode === 'highlight') setMeterMode(session.meterMode); + if (session.shutterSound === 'on' || session.shutterSound === 'off') setShutterSound(session.shutterSound); if (session.gpsInfo) setGpsInfo(session.gpsInfo); if (session.selectedRecipeId) { restoredRecipe = list.find((r: Recipe) => r.id === session.selectedRecipeId) || null; @@ -172,6 +214,13 @@ export default function App() { }; const handleUpdateAdjustments = (updates: Partial) => { + // Storm guard, generic across every param: same-value writes (slider + // micro-jitter / repeated pointer-move events) still build a fresh + // adjustments object and re-render the whole tree — skip them. Supersedes + // the old EV-only dedupe; EV flush at capture reads its own ref, so a + // skipped identical EV needs no re-send. + const keys = Object.keys(updates) as (keyof ColorAdjustments)[]; + if (keys.every((k) => updates[k] === adjustments[k])) return; // B8: never call a setState inside another setState's updater. const next = { ...adjustments, ...updates }; setAdjustments(next); @@ -214,9 +263,6 @@ export default function App() { const handleAspectRatio = (ratio: AspectRatio) => { setAspectRatio(ratio); - if (openTab === 'ratio') { - Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); - } }; const handleRawEnabled = (enabled: boolean) => { @@ -236,7 +282,7 @@ export default function App() { // in that state, drop RAW (removing the output reconfigures back to the // single working JPEG session) instead of leaving a dead camera. const handleCameraSessionError = useCallback((error: Error) => { - console.error('[camera-session] error:', error); + console.error('Camera session error:', error); if (rawEnabledRef.current && !rawFailRef.current) { rawFailRef.current = true; setRawEnabled(false); @@ -264,7 +310,6 @@ export default function App() { } else { await MediaLibraryLegacy.createAlbumAsync(albumName, asset); } - console.error(`[raw] saved DNG to album ${albumName}`); return true; } catch (e) { console.error('RAW album save failed:', e); @@ -287,6 +332,16 @@ export default function App() { Alert.alert('Recipe Saved', `"${name}" has been created.`); }; + // PRESETS → CREATE quick-input: build a brand-new recipe from the modal's + // typed fields, persist it, and apply it (the user sees the look immediately). + const handleCreateRecipe = async (recipe: Omit) => { + const newRecipe = await saveCustomRecipe(recipe); + const list = await getAllRecipes(); + setRecipes(list); + applyRecipe(newRecipe); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + }; + const handleDeleteRecipe = async (id: string) => { await deleteCustomRecipe(id); const list = await getAllRecipes(); @@ -309,10 +364,9 @@ export default function App() { try { const perm = await MediaLibrary.requestPermissionsAsync(false, ['photo']); mediaOk = perm.granted; - console.error(`[gps] pre-pick media+location permission granted=${perm.granted}`); } catch (e) { mediaOk = false; - console.error('[gps] pre-pick media permission error: ' + String(e).slice(0, 120)); + console.warn('Pre-pick media+photo-location permission error:', e); } } @@ -333,7 +387,6 @@ export default function App() { if (!result.canceled && result.assets && result.assets.length > 0) { const asset = result.assets[0]; - console.error(`[gps] picked uri=${asset.uri} assetId=${asset.assetId || 'null'} exifGPS=${asset.exif ? JSON.stringify(asset.exif.GPSLatitude ?? null) : 'no-exif'}`); setLibraryImageUri(asset.uri); setMode('library'); // Clear old GPS — will be replaced if the photo (or device) has location data @@ -351,9 +404,6 @@ export default function App() { if (permissionDenied) { console.warn('Media library read permission denied — photo GPS unavailable.'); } - console.error( - `[gps] resolved ${gps ? `src=${gps.source} lat=${gps.latitude.toFixed(5)} lon=${gps.longitude.toFixed(5)} loc=${(gps.locality || '').slice(0, 40)}` : 'none'}` - ); Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); } @@ -369,6 +419,9 @@ export default function App() { useGeotag, }; + // Thumbnail/preview target for the camera-mode right button: newest photo. + const lastPhotoUri = photoHistory.length > 0 ? photoHistory[photoHistory.length - 1].uri : null; + const handleCapture = async () => { if (isProcessing) return; @@ -403,10 +456,9 @@ export default function App() { try { await viewfinderRef.current?.flushExposureBias(); } catch (e) { - console.error('[ev] flush at capture failed: ' + String(e)); + console.warn('EV flush at capture failed:', e); } - const { filePath } = await photoOutput.capturePhotoToFile({}, {}); - console.error(`[capture] shot-took ${Date.now() - tShot}ms`); + const { filePath } = await photoOutput.capturePhotoToFile({ enableShutterSound: shutterSound === 'on' }, {}); const sourceUri = toUri(filePath); // RAW DNG sidecar: fire the second exposure immediately after the JPEG @@ -414,9 +466,7 @@ export default function App() { // "RAW" album without blocking the JPEG export below. if (rawEnabled && rawPhotoOutput) { try { - const tRaw = Date.now(); - const rawFile = await rawPhotoOutput.capturePhotoToFile({}, {}); - console.error(`[capture] raw-shot-took ${Date.now() - tRaw}ms`); + const rawFile = await rawPhotoOutput.capturePhotoToFile({ enableShutterSound: shutterSound === 'on' }, {}); const rawUri = toUri(rawFile.filePath); saveRawToAlbum(rawUri).then((ok) => { if (!ok) { @@ -431,7 +481,7 @@ export default function App() { const tExp = Date.now(); const result = await processAndExportPhoto( sourceUri, - { ...activeRecipe, adjustments, frameId: selectedFrame, useGeotag }, + { ...activeRecipe, adjustments: renderAdj, frameId: selectedFrame, useGeotag }, selectedFrame, useGeotag, captureGps, @@ -445,12 +495,16 @@ export default function App() { aspect: aspectRatio === 'full' ? undefined : aspectRatio, } ); - console.error(`[capture] export-took ${Date.now() - tExp}ms (pipeline total ${Date.now() - tShot}ms)`); if (result) { - setLastPhotoUri(result.uri); - setLastSavedToLibrary(result.savedToLibrary); - setPreviewVisible(true); + // No auto preview after a capture — the thumbnail button opens the + // swipe viewer. Saved to session history either way. + pushPhoto({ + uri: result.uri, + recipeName: activeRecipe.name, + savedToLibrary: result.savedToLibrary, + assetId: result.assetId, + }); Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); } else { Alert.alert('Failed', 'Error occurred while processing the captured photo.'); @@ -491,9 +545,15 @@ export default function App() { setIsProcessing(false); if (result) { - setLastPhotoUri(result.uri); - setLastSavedToLibrary(result.savedToLibrary); - setPreviewVisible(true); + pushPhoto({ + uri: result.uri, + recipeName: activeRecipe.name, + savedToLibrary: result.savedToLibrary, + assetId: result.assetId, + }); + // Library has no thumbnail button (right button switches back to camera), + // so the export result auto-opens the viewer on the newest photo. + setViewerIndex(photoHistory.length); Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); } else { Alert.alert('Failed', 'Error occurred while processing image.'); @@ -509,6 +569,115 @@ export default function App() { setMode(next); }; + // Append a finished export (camera capture or library export) to the session + // photo history. Returned entry id lets callers delete by id. + const pushPhoto = (p: Omit): string => { + const id = `photo-${Date.now()}-${photoSeq.current++}`; + setPhotoHistory((h) => [...h, { id, ...p }]); + return id; + }; + + // Thumbnail (camera mode) opens the viewer on the newest photo. + const openLatestViewer = () => { + if (photoHistory.length > 0) setViewerIndex(photoHistory.length - 1); + }; + + // Viewer trash: delete the photo from the app AND its gallery copy (when it + // was saved). Deleting a saved photo goes through Android's per-item system + // confirmation (scoped storage — every single delete asks again by design); + // if the user cancels THAT dialog the photo is kept in both places. + const handleDeletePhoto = async (id: string) => { + const idx = photoHistory.findIndex((p) => p.id === id); + if (idx < 0) return; + const entry = photoHistory[idx]; + const remove = () => { + const next = photoHistory.filter((p) => p.id !== id); + setPhotoHistory(next); + setViewerIndex((prev) => { + if (prev === null) return null; + if (next.length === 0) return null; + if (prev > idx) return prev - 1; + if (prev >= next.length) return next.length - 1; + return prev; + }); + }; + const deleteCache = async () => { + try { + await FileSystem.deleteAsync(entry.uri, { idempotent: true }); + } catch (e) { + console.warn('Photo cache delete failed:', e); + } + }; + + if (!entry.savedToLibrary || !entry.assetId) { + // Never reached the gallery — nothing for the OS to confirm. + remove(); + deleteCache(); + return; + } + try { + // deleteAssetsAsync shows the OS delete confirmation when the photo is + // in the gallery. false = user cancelled it → keep everything. + const ok = await MediaLibraryLegacy.deleteAssetsAsync([entry.assetId]); + if (!ok) { + Alert.alert('Photo Kept', 'Android did not confirm the deletion, so the photo stays here and in your gallery.'); + return; + } + remove(); + deleteCache(); + } catch (e) { + console.warn('Gallery delete failed:', e); + Alert.alert('Delete Failed', 'Could not remove the photo from your gallery. It stays here too.'); + } + }; + + // Viewer SAVE & DONE: photo was exported to cache only — copy it into the + // gallery now and remember its assetId so a later trash can remove it. + const handleSavePhoto = async (id: string) => { + const entry = photoHistory.find((p) => p.id === id); + if (!entry || entry.savedToLibrary) return; + const perm = await MediaLibraryLegacy.requestPermissionsAsync(); + if (!perm.granted) { + Alert.alert('Not Saved', 'Media library access was denied, so this photo was not saved to your gallery.'); + return; + } + try { + const asset = await MediaLibraryLegacy.createAssetAsync(entry.uri); + setPhotoHistory((h) => h.map((p) => (p.id === id ? { ...p, savedToLibrary: true, assetId: asset.id } : p))); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error('Save to gallery failed:', e); + Alert.alert('Save Failed', 'Could not save this photo to your gallery.'); + } + }; + + // Tool-rail toggle: closing the panel (or switching tabs) also drops the open + // parameter row — otherwise a stale slider row (and its image-drag target) + // would survive into the next panel. + const handleToggleTab = (tab: TabId) => { + setOpenTab((prev) => (prev === tab ? null : tab)); + setOpenParamKey(null); + }; + + // While a panel parameter row is open, a vertical drag anywhere on the live + // camera image adjusts that same parameter (the open slider follows). Open + // row wins over the locked-AE EV drag; a plain tap still locks focus. + const imageAdjustTarget = (() => { + if (mode !== 'camera' || openTab !== 'iq' && openTab !== 'wb' && openTab !== 'filters') return null; + if (!openParamKey) return null; + const list = openTab === 'iq' ? PARAM_DEFS.iq : openTab === 'wb' ? PARAM_DEFS.wb : PARAM_DEFS.filters; + const def = list.find((d) => d.key === openParamKey); + if (!def) return null; + return { + key: def.key, + min: def.min, + max: def.max, + step: def.step, + value: def.get(adjustments), + onChange: (v: number) => handleUpdateAdjustments(def.set(v)), + }; + })(); + return ( @@ -540,6 +709,9 @@ export default function App() { aspectRatio={aspectRatio} onSessionError={handleCameraSessionError} onExposureChange={(ev) => handleUpdateAdjustments({ exposureCompensation: ev })} + meteringEvOffset={meteringActive ? METER_HL_EV : 0} + meteringAdjustments={meteringAdj} + imageAdjustTarget={imageAdjustTarget} /> @@ -564,11 +736,10 @@ export default function App() { adjustments={adjustments} selectedFrame={selectedFrame} useGeotag={useGeotag} - aspectRatio={aspectRatio} - rawEnabled={rawEnabled} - cameraMode={mode === 'camera'} - onAspectRatio={handleAspectRatio} - onRawEnabled={handleRawEnabled} + openParam={openParamKey} + onOpenParamChange={setOpenParamKey} + currentBaseFilter={selectedRecipe?.baseFilter} + onCreateRecipe={handleCreateRecipe} onSelectRecipe={applyRecipe} onUpdateAdjustments={handleUpdateAdjustments} onUpdateFrame={handleUpdateFrame} @@ -579,25 +750,42 @@ export default function App() { )} - setOpenTab(openTab === tab ? null : tab)} /> + setPreviewVisible(true)} + onOpenPreview={openLatestViewer} + onOpenSettings={() => setSettingsVisible(true)} isLibraryMode={mode === 'library'} onSwitchToCamera={() => handleSetMode('camera')} /> - {/* Preview Modal */} - setPreviewVisible(false)} - photoUri={lastPhotoUri} - recipeName={selectedRecipe?.name || 'Custom'} - savedToLibrary={lastSavedToLibrary} + {/* Gear sheet: shutter sound / ratio+RAW / metering mode */} + setSettingsVisible(false)} + aspectRatio={aspectRatio} + onAspectRatio={handleAspectRatio} + rawEnabled={rawEnabled} + onRawEnabled={handleRawEnabled} + cameraMode={mode === 'camera'} + meterMode={meterMode} + onMeterModeChange={setMeterMode} + shutterSound={shutterSound} + onShutterSound={setShutterSound} + /> + + {/* Session photo viewer (swipe across captured/exported photos) */} + 0} + photos={photoHistory} + initialIndex={viewerIndex ?? 0} + onClose={() => setViewerIndex(null)} + onDelete={handleDeletePhoto} + onSave={handleSavePhoto} /> {/* Global Processing Loader Overlay */} diff --git a/src/components/AdjustmentPanel.tsx b/src/components/AdjustmentPanel.tsx index 8d3ea76..46987b0 100644 --- a/src/components/AdjustmentPanel.tsx +++ b/src/components/AdjustmentPanel.tsx @@ -3,8 +3,11 @@ import { View, Text, TouchableOpacity, ScrollView } from 'react-native'; import Slider from '@react-native-community/slider'; import * as Haptics from 'expo-haptics'; import { Trash2 } from 'lucide-react-native'; -import { Recipe, ColorAdjustments, FrameId, AspectRatio } from '../types'; +import { Recipe, ColorAdjustments, FrameId, BaseFilter } from '../types'; import { FRAMES } from '../utils/frameUtils'; +import { PARAM_DEFS, ContinuousParamDef } from '../utils/paramDefs'; +import { FILM_SIMS, filmSimToRecipe } from '../utils/defaultRecipes'; +import RecipeCreateModal from './RecipeCreateModal'; // Compact bottom sheet above the tool rail: // bottom row = the tool's chips (presets / parameters), horizontally scrollable @@ -12,7 +15,7 @@ import { FRAMES } from '../utils/frameUtils'; // Tapping a parameter chip toggles its slider row; chips stay visible. // Darkroom-flavoured: amber = active/edited, red = destructive, mono labels. -type TabId = 'recipes' | 'iq' | 'wb' | 'filters' | 'frame' | 'ratio'; +type TabId = 'recipes' | 'iq' | 'wb' | 'filters' | 'frame'; // Choice-group keys that open a strip above the chip row: color chrome groups // (wb tab) and the D.RANGE selector (iq tab). type GroupKey = 'cx' | 'cxb' | 'dr'; @@ -24,16 +27,23 @@ interface AdjustmentPanelProps { adjustments: ColorAdjustments; selectedFrame: FrameId; useGeotag: boolean; - aspectRatio: AspectRatio; - rawEnabled: boolean; - // RAW (DNG sidecar) is only meaningful while the live camera is the source. - cameraMode: boolean; + // RAW (DNG sidecar) / aspect-ratio / metering-mode now live in the gear + // Settings sheet (gear between library picker and shutter) — no longer + // tool-rail tabs. + // The parameter whose slider row is open — lifted to App so it can also drive + // drag-anywhere-on-the-image adjustment while the row is open. + openParam: string | null; + onOpenParamChange: (key: string | null) => void; + // Base filter of the currently applied recipe — seeds the CREATE modal's + // SIMULATION row so quick-input starts from the active look. + currentBaseFilter?: BaseFilter; + // CREATE quick-input saves a brand-new recipe (name + adjustments from the + // modal) and applies it, unlike onSaveRecipe which snapshots the live state. + onCreateRecipe: (recipe: Omit) => void; onSelectRecipe: (recipe: Recipe) => void; onUpdateAdjustments: (adjustments: Partial) => void; onUpdateFrame: (frameId: FrameId) => void; onToggleGeotag: (enabled: boolean) => void; - onAspectRatio: (ratio: AspectRatio) => void; - onRawEnabled: (enabled: boolean) => void; onSaveRecipe: (name: string) => void; onDeleteRecipe: (id: string) => void; } @@ -62,8 +72,19 @@ interface ParamDef { } const haptic = () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); -const sign = (v: number) => (v > 0 ? `+${v}` : String(v)); -const oneEv = (v: number) => `${v > 0 ? '+' : ''}${v.toFixed(1)} EV`; + +// WB preset → engine pair. AUTO and DAYLIGHT both land on the neutral +// 5500K / 0 pair (the engine has no scene meter), so the pair alone cannot say +// which chip is active — the last tapped preset is remembered to disambiguate. +const WB_PAIRS: Record = { + auto: { t: 5500, ti: 0 }, + daylight: { t: 5500, ti: 0 }, + 'daylight-3r': { t: 5500, ti: -3 }, + cloudy: { t: 6500, ti: 1 }, + shade: { t: 8000, ti: 2 }, + tungsten: { t: 3200, ti: 0 }, + fluorescent: { t: 4000, ti: 3 }, +}; export default function AdjustmentPanel({ activeTab, @@ -72,31 +93,36 @@ export default function AdjustmentPanel({ adjustments, selectedFrame, useGeotag, - aspectRatio, - rawEnabled, - cameraMode, + openParam, + onOpenParamChange, + currentBaseFilter, + onCreateRecipe, onSelectRecipe, onUpdateAdjustments, onUpdateFrame, onToggleGeotag, - onAspectRatio, - onRawEnabled, onDeleteRecipe, }: AdjustmentPanelProps) { - // The single parameter whose slider row is open — a new selection replaces - // the previous row (one row at a time, above the chips). - const [openParam, setOpenParam] = useState(null); // The single choice-group whose strip (OFF/WEAK/STRONG, or the DR ladder) is - // open above the chips (same one-row-at-a-time pattern as openParam). + // open above the chips (same one-row-at-a-time pattern as openParam — which + // lives in App now, since an open row also arms image-drag adjustment). const [openGroup, setOpenGroup] = useState(null); + // PRESETS tab only: RECIPES chip expands the user-recipe strip above the main + // row; CREATE chip opens the quick-input modal. + const [showRecipes, setShowRecipes] = useState(false); + const [createVisible, setCreateVisible] = useState(false); + // WB tab: preset last tapped while its engine pair is still in effect (AUTO + // vs DAYLIGHT share the neutral pair, so selection can't be derived). + const [wbChoice, setWbChoice] = useState(null); useEffect(() => { - setOpenParam(null); setOpenGroup(null); + setShowRecipes(false); + setCreateVisible(false); }, [activeTab]); const toggleParam = (key: string) => { haptic(); - setOpenParam((prev) => (prev === key ? null : key)); + onOpenParamChange(openParam === key ? null : key); }; const toggleGroup = (g: GroupKey) => { @@ -178,51 +204,49 @@ export default function AdjustmentPanel({ ); // ---- per-tab parameter definitions --------------------------------------- + // Static bounds/labels/accessors live in PARAM_DEFS (shared with App, which + // needs the same metadata to drive drag-anywhere adjustment); here each row + // is bound to the live adjustments value + an update callback. + const toRows = (defs: ContinuousParamDef[]): ParamDef[] => + defs.map((d) => ({ + key: d.key, + label: d.label, + value: d.get(a), + default: d.defaultValue, + min: d.min, + max: d.max, + step: d.step, + display: d.display, + onChange: (v: number) => onUpdateAdjustments(d.set(v)), + })); const paramDefs: Record = { recipes: [], - iq: [ - { key: 'exposure', label: 'EXPOSURE', value: a.exposure, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ exposure: v }) }, - { key: 'ev', label: 'EV', value: a.exposureCompensation ?? 0, default: 0, min: -3, max: 3, step: 0.5, display: oneEv, onChange: (v) => onUpdateAdjustments({ exposureCompensation: v }) }, - { key: 'contrast', label: 'CONTRAST', value: a.contrast, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ contrast: v }) }, - { key: 'color', label: 'COLOR', value: a.saturation, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ saturation: v }) }, - { key: 'highlight', label: 'HIGHLIGHT', value: a.highlight ?? 0, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ highlight: v }) }, - { key: 'shadow', label: 'SHADOW', value: a.shadow ?? 0, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ shadow: v }) }, - ], - wb: [ - { key: 'temperature', label: 'COLOR TEMP', value: a.temperature, default: 5500, min: 2500, max: 10000, step: 100, display: (v) => `${v}K`, onChange: (v) => onUpdateAdjustments({ temperature: v }) }, - { key: 'tint', label: 'TINT', value: a.tint ?? 0, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ tint: v }) }, - ], - filters: [ - { key: 'denoise', label: 'NOISE REDUCTION', value: a.denoise, default: 0, min: 0, max: 10, step: 1, display: String, onChange: (v) => onUpdateAdjustments({ denoise: v }) }, - { key: 'clarity', label: 'CLARITY', value: a.clarity, default: 0, min: -10, max: 10, step: 1, display: sign, onChange: (v) => onUpdateAdjustments({ clarity: v }) }, - { key: 'sharpening', label: 'SHARPENING', value: a.sharpening ?? 0, default: 0, min: 0, max: 10, step: 1, display: String, onChange: (v) => onUpdateAdjustments({ sharpening: v }) }, - { key: 'grain', label: 'MONOCHROME GRAIN', value: a.grain, default: 0, min: 0, max: 10, step: 1, display: String, onChange: (v) => onUpdateAdjustments({ grain: v }) }, - ], + iq: toRows(PARAM_DEFS.iq), + wb: toRows(PARAM_DEFS.wb), + filters: toRows(PARAM_DEFS.filters), frame: [], - ratio: [], }; - const wbPresetOf = (): string => { + // Active WB chip: the remembered preset wins while the engine pair still + // matches it; otherwise derive from the pair (neutral ⇒ AUTO; any unlisted + // pair also reads as AUTO — no preset is a stronger claim there). + const wbActive = (): string => { const t = a.temperature ?? 5500; const ti = a.tint ?? 0; - if (t === 5500 && ti === -3) return 'daylight-3r'; - if (t === 6500 && ti === 1) return 'cloudy'; - if (t === 8000 && ti === 2) return 'shade'; - if (t === 3200 && ti === 0) return 'tungsten'; - if (t === 4000 && ti === 3) return 'fluorescent'; - if (t === 5500 && ti === 0) return 'daylight'; - return 'auto'; + if (wbChoice) { + const p = WB_PAIRS[wbChoice]; + if (p && p.t === t && p.ti === ti) return wbChoice; + } + const hit = (Object.keys(WB_PAIRS) as string[]).find((k) => { + const p = WB_PAIRS[k]; + return p.t === t && p.ti === ti; + }); + return hit ?? 'auto'; }; const wbApply = (val: string) => { - switch (val) { - case 'daylight': return onUpdateAdjustments({ temperature: 5500, tint: 0 }); - case 'daylight-3r': return onUpdateAdjustments({ temperature: 5500, tint: -3 }); - case 'cloudy': return onUpdateAdjustments({ temperature: 6500, tint: 1 }); - case 'shade': return onUpdateAdjustments({ temperature: 8000, tint: 2 }); - case 'tungsten': return onUpdateAdjustments({ temperature: 3200, tint: 0 }); - case 'fluorescent': return onUpdateAdjustments({ temperature: 4000, tint: 3 }); - default: return onUpdateAdjustments({ temperature: 5500, tint: 0 }); - } + setWbChoice(val); + const p = WB_PAIRS[val] ?? WB_PAIRS.auto; + onUpdateAdjustments({ temperature: p.t, tint: p.ti }); }; // Choice-groups: one toggle chip sits in the chip row (COLOR CHROME / @@ -270,21 +294,29 @@ export default function AdjustmentPanel({ const chipsRow = (() => { switch (activeTab) { case 'recipes': { - if (recipes.length === 0) { - return ( - - NO PRESETS - TAP SAVE ABOVE - - ); - } - const chips: ChipDef[] = recipes.map((r) => ({ - key: r.id, - label: r.name, - active: r.id === currentRecipeId, - trash: !!r.isCustom, - onPress: () => onSelectRecipe(r), - onPressDelete: () => onDeleteRecipe(r.id), - })); + // Main row: the six standard film simulations, then the RECIPES toggle + // (expands the user/bundled recipe strip above) and CREATE (quick-input + // modal). Recipes themselves are no longer inline chips here. + const chips: ChipDef[] = [ + ...FILM_SIMS.map((s) => ({ + key: s.id, + label: s.name, + active: currentRecipeId === s.id, + onPress: () => onSelectRecipe(filmSimToRecipe(s)), + })), + { + key: 'recipes-toggle', + label: 'RECIPES', + active: showRecipes, + onPress: () => setShowRecipes((v) => !v), + }, + { + key: 'create', + label: 'CREATE', + active: false, + onPress: () => setCreateVisible(true), + }, + ]; return ( ); - case 'ratio': - // Composition aspect (FULL = current fullscreen, 4:3 / 3:2 are the - // upright photo ratios) + RAW DNG sidecar toggle (camera captures - // only — dimmed in library mode where the shutter exports a still). - return ( - - {renderChip({ - key: 'raw', - label: rawEnabled ? 'RAW ON' : 'RAW OFF', - active: rawEnabled, - disabled: !cameraMode, - onPress: () => onRawEnabled(!rawEnabled), - })} - {choiceChips( - 'ratio', - [ - { v: 'full', d: 'FULL' }, - { v: '4:3', d: '4:3' }, - { v: '3:2', d: '3:2' }, - ], - aspectRatio, - (v) => onAspectRatio(v as AspectRatio) - )} - - ); - default: return null; } @@ -469,7 +471,47 @@ export default function AdjustmentPanel({ )} + {/* PRESETS: expanded recipe strip (above the main chip row) while the + RECIPES chip is open — bundled defaults + user-created, custom + deletable inline. */} + {activeTab === 'recipes' && showRecipes && ( + + + {recipes.length === 0 + ? renderChip({ + key: 'no-recipes', + label: 'NO RECIPES YET - TAP CREATE', + disabled: true, + active: false, + onPress: () => {}, + }) + : recipes.map((r) => + renderChip({ + key: r.id, + label: r.name, + active: r.id === currentRecipeId, + trash: !!r.isCustom, + onPress: () => onSelectRecipe(r), + onPressDelete: () => onDeleteRecipe(r.id), + }) + )} + + + )} {chipsRow} + setCreateVisible(false)} + onSave={(recipe) => { + onCreateRecipe(recipe); + setShowRecipes(true); + }} + /> ); } diff --git a/src/components/CameraControls.tsx b/src/components/CameraControls.tsx index a28d64a..85f20bd 100644 --- a/src/components/CameraControls.tsx +++ b/src/components/CameraControls.tsx @@ -1,13 +1,14 @@ import React from 'react'; import { View, Text, TouchableOpacity, Image, StyleSheet } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; -import { Image as ImageIcon, Eye, Download, Camera } from 'lucide-react-native'; +import { Image as ImageIcon, Eye, Download, Camera, Settings } from 'lucide-react-native'; interface CameraControlsProps { lastPhotoUri: string | null; onCapture: () => void; onPickImage: () => void; onOpenPreview: () => void; + onOpenSettings: () => void; isLibraryMode: boolean; onSwitchToCamera?: () => void; } @@ -17,6 +18,7 @@ export default function CameraControls({ onCapture, onPickImage, onOpenPreview, + onOpenSettings, isLibraryMode, onSwitchToCamera, }: CameraControlsProps) { @@ -27,14 +29,24 @@ export default function CameraControls({ style={{ paddingBottom: insets.bottom + 10 }} className="flex-row items-center justify-between px-7 pt-2" > - {/* Pick Image Button (left) */} - - - + {/* Left cluster: Pick Image + gear (gear sits between library & shutter) */} + + + + + + + + + {/* Dynamic Center Button: Shutter or Save */} {isLibraryMode ? ( diff --git a/src/components/PhotoViewerModal.tsx b/src/components/PhotoViewerModal.tsx new file mode 100644 index 0000000..dd89c03 --- /dev/null +++ b/src/components/PhotoViewerModal.tsx @@ -0,0 +1,219 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { View, Text, Modal, Image, TouchableOpacity, ScrollView, Share, Alert, useWindowDimensions } from 'react-native'; +import * as Sharing from 'expo-sharing'; +import { X, Share2, Download, Trash2 } from 'lucide-react-native'; +import { PhotoEntry } from '../types'; + +// Session photo viewer: swipe left/right across every photo taken/exported in +// this session. Top shows preset name + index/total; trash deletes the photo +// being viewed (confirm modal first); share/save as before. Opened from the +// thumbnail button (camera mode) or automatically after a library export — +// NOT after a camera capture (that only fills the thumbnail). +interface PhotoViewerModalProps { + visible: boolean; + photos: PhotoEntry[]; + initialIndex: number; + onClose: () => void; + // Remove photo id from the session history (App also deletes cache + gallery copy). + onDelete: (id: string) => void; + // Save the (unsaved) photo id to the gallery; App stores the resulting assetId. + onSave: (id: string) => Promise; +} + +export default function PhotoViewerModal({ + visible, + photos, + initialIndex, + onClose, + onDelete, + onSave, +}: PhotoViewerModalProps) { + const { width } = useWindowDimensions(); + const [index, setIndex] = useState(Math.max(0, Math.min(initialIndex, photos.length - 1))); + const scrollRef = useRef(null); + const [saving, setSaving] = useState(false); + const wasOpen = useRef(false); + + // Opening the modal (or reopening on a different photo): jump to initialIndex. + // Shrinks of the list while open (deletion) must NOT re-scroll — the strip + // shifts left by one page and the same page slot keeps showing the next photo. + useEffect(() => { + if (!visible) { + wasOpen.current = false; + return; + } + if (!wasOpen.current) { + wasOpen.current = true; + if (photos.length > 0) { + const i = Math.max(0, Math.min(initialIndex, photos.length - 1)); + setIndex(i); + requestAnimationFrame(() => { + scrollRef.current?.scrollTo({ x: i * width, animated: false }); + }); + } + } + }, [visible, initialIndex, width, photos.length]); + + // Keep the page state in bounds when the list shrinks underneath us. + useEffect(() => { + if (visible && photos.length > 0 && index >= photos.length) { + const i = photos.length - 1; + setIndex(i); + scrollRef.current?.scrollTo({ x: i * width, animated: false }); + } + }, [visible, index, photos.length, width]); + + const photo = photos[index] || null; + + const handleShare = async () => { + if (!photo) return; + try { + if (await Sharing.isAvailableAsync()) { + await Sharing.shareAsync(photo.uri, { + mimeType: 'image/jpeg', + dialogTitle: `Share with CamRecipe Pro - Preset: ${photo.recipeName}`, + UTI: 'public.jpeg', + }); + } else { + await Share.share({ + url: photo.uri, + message: `Captured with CamRecipe Pro - Preset: ${photo.recipeName}`, + }); + } + } catch (error) { + console.error('Sharing failed:', error); + } + }; + + const handleDeletePress = () => { + if (!photo) return; + if (photo.savedToLibrary) { + // The gallery copy exists → Android itself shows its per-item delete + // confirmation, so no app modal in front of it. + onDelete(photo.id); + return; + } + // Never reached the gallery — no system prompt will happen, keep an app + // confirm as the only guard against an accidental trash tap. + Alert.alert( + 'Delete Photo', + 'Delete this photo? It was never saved to your gallery.', + [ + { text: 'Cancel', style: 'cancel' }, + { text: 'Delete', style: 'destructive', onPress: () => onDelete(photo.id) }, + ] + ); + }; + + const handleDone = async () => { + if (!photo || photo.savedToLibrary || saving) { + onClose(); + return; + } + setSaving(true); + try { + await onSave(photo.id); + onClose(); + } catch (e) { + console.error('Save failed:', e); + } finally { + setSaving(false); + } + }; + + return ( + + + {/* Top bar: preset + index/total (left), trash + close (right) */} + + + + {photo ? photo.recipeName.toUpperCase() : ''} + + + {photos.length > 0 ? `${index + 1} / ${photos.length}` : ''} + + + + {photo && ( + + + + )} + + + + + + + {/* Swipeable photo strip */} + {photos.length > 0 ? ( + { + const i = Math.round(e.nativeEvent.contentOffset.x / width); + setIndex(Math.max(0, Math.min(i, photos.length - 1))); + }} + > + {photos.map((p) => ( + + + + ))} + + ) : ( + + NO PHOTOS + + )} + + {/* Bottom bar */} + + {photo && !photo.savedToLibrary && ( + + NOT SAVED TO GALLERY - SAVE & DONE TO KEEP + + )} + + + + SHARE + + + + + {saving ? 'SAVING...' : photo && !photo.savedToLibrary ? 'SAVE & DONE' : 'DONE'} + + + + + + + ); +} diff --git a/src/components/PreviewModal.tsx b/src/components/PreviewModal.tsx deleted file mode 100644 index bf8b442..0000000 --- a/src/components/PreviewModal.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { View, Text, Modal, Image, TouchableOpacity, Share, Alert } from 'react-native'; -import * as Sharing from 'expo-sharing'; -import * as MediaLibrary from 'expo-media-library/legacy'; -import { X, Share2, Download } from 'lucide-react-native'; - -interface PreviewModalProps { - visible: boolean; - onClose: () => void; - photoUri: string | null; - recipeName: string; - savedToLibrary: boolean; // whether the export was already saved to the gallery -} - -export default function PreviewModal({ - visible, - onClose, - photoUri, - recipeName, - savedToLibrary: initialSaved, -}: PreviewModalProps) { - const [saved, setSaved] = useState(initialSaved); - - // Modal stays mounted — refresh state whenever a new export is shown. - useEffect(() => { - if (visible) setSaved(initialSaved); - }, [visible, initialSaved]); - - const handleShare = async () => { - if (!photoUri) return; - try { - // expo-sharing actually shares the file; React Native's Share.share cannot - // attach local files. Fall back to Share on platforms where it's unavailable. - if (await Sharing.isAvailableAsync()) { - await Sharing.shareAsync(photoUri, { - mimeType: 'image/jpeg', - dialogTitle: `Share with CamRecipe Pro - Preset: ${recipeName}`, - UTI: 'public.jpeg', - }); - } else { - await Share.share({ - url: photoUri, - message: `Captured with CamRecipe Pro - Preset: ${recipeName}`, - }); - } - } catch (error) { - console.error('Sharing failed:', error); - } - }; - - const handleDone = async () => { - if (!photoUri || saved) { - onClose(); - return; - } - try { - const perm = await MediaLibrary.requestPermissionsAsync(); - if (!perm.granted) { - Alert.alert( - 'Not Saved', - 'Media library access was denied, so this photo was not saved to your gallery. You can still share it from here.' - ); - onClose(); - return; - } - await MediaLibrary.saveToLibraryAsync(photoUri); - setSaved(true); - onClose(); - } catch (error) { - console.error('Save to gallery failed:', error); - Alert.alert('Save Failed', 'Could not save this photo to your gallery.'); - onClose(); - } - }; - - const handleClose = () => { - if (photoUri && !saved) { - Alert.alert( - 'Not Saved to Gallery', - 'This photo lives in the app cache only. Tap DONE to save a copy to your gallery, or SHARE it now.' - ); - return; - } - onClose(); - }; - - return ( - - - {/* Top bar */} - - PRESET: {recipeName.toUpperCase()} - - - - - - {/* Image display */} - - {photoUri ? ( - - ) : ( - NO IMAGE CAPTURED - )} - - - {/* Bottom bar */} - - {photoUri && !saved && ( - - NOT SAVED TO GALLERY - TAP DONE TO SAVE - - )} - - - - SHARE - - - - - - {saved ? 'DONE' : 'SAVE & DONE'} - - - - - - - ); -} diff --git a/src/components/RecipeCreateModal.tsx b/src/components/RecipeCreateModal.tsx new file mode 100644 index 0000000..057f635 --- /dev/null +++ b/src/components/RecipeCreateModal.tsx @@ -0,0 +1,417 @@ +import React, { useEffect, useState } from 'react'; +import { + View, + Text, + TextInput, + ScrollView, + TouchableOpacity, + Modal, + KeyboardAvoidingView, + Platform, +} from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import * as Haptics from 'expo-haptics'; +import { Recipe, ColorAdjustments, BaseFilter } from '../types'; +import { DEFAULT_ADJUSTMENTS, FILM_SIMS } from '../utils/defaultRecipes'; + +// "CREATE" quick-input form shown above the viewfinder. Numeric knobs are +// plain textboxes (typed fast, one row each), categorical knobs are chip +// dropdowns. Used to enter Fuji-style recipes (DR/Highlight/Shadow/Color/NR/ +// Sharpness/Clarity/Grain/CC/CCB/WB+shift/ISO/EV) without touching sliders. + +const haptic = () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + +interface RecipeCreateModalProps { + visible: boolean; + // Id of the currently applied film sim (or bundled recipe whose look should + // prefill the SIMULATION row); undefined → default to PROVIA. + currentBase?: BaseFilter; + onClose: () => void; + onSave: (recipe: Omit) => void; +} + +// WB presets mirror the WB-tab chips but keep pure presets (no -R variants — +// those are the separate Red/Blue offset textboxes below). +const WB_PRESETS: { key: string; label: string; temperature: number; tint: number }[] = [ + { key: 'auto', label: 'AUTO', temperature: 5500, tint: 0 }, + { key: 'daylight', label: 'DAYLIGHT', temperature: 5500, tint: 0 }, + { key: 'cloudy', label: 'CLOUDY', temperature: 6500, tint: 1 }, + { key: 'shade', label: 'SHADE', temperature: 8000, tint: 2 }, + { key: 'tungsten', label: 'TUNGSTEN', temperature: 3200, tint: 0 }, + { key: 'fluor', label: 'FLUOR', temperature: 4000, tint: 3 }, +]; +const WB_KEYS = WB_PRESETS.map((w) => w.key); + +const DR_OPTS = [ + { v: 'auto', d: 'AUTO' }, + { v: '100', d: 'DR100' }, + { v: '200', d: 'DR200' }, + { v: '400', d: 'DR400' }, +] as const; +const CC_OPTS = [ + { v: 'none', d: 'OFF' }, + { v: 'weak', d: 'WEAK' }, + { v: 'strong', d: 'STRONG' }, +] as const; +const GRAIN_OPTS = [ + { v: '0', d: 'OFF' }, + { v: '3', d: 'WEAK' }, + { v: '6', d: 'STRONG' }, +] as const; + +// ISO has no manual control path on this build (the vision-camera lib only +// exposes exposure locking on iOS; Android CameraX keeps ISO automatic), so the +// modal shows AUTO. If a native path ever appears, feed isoSupported=true and +// the row below turns into a selectable chip list. +const ISO_SUPPORTED = false; +const ISO_STOPS = [200, 400, 800, 1600, 3200, 6400]; + +const clamp = (v: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, v)); +const int = (s: string, fallback: number, lo: number, hi: number) => { + const n = parseInt(s, 10); + return Number.isFinite(n) ? clamp(n, lo, hi) : fallback; +}; + +interface ChipProps { + label: string; + active: boolean; + onPress: () => void; + disabled?: boolean; +} +const Chip = ({ label, active, onPress, disabled }: ChipProps) => ( + { if (!disabled) { haptic(); onPress(); } }} + className={`mx-0.5 rounded-full border px-2.5 py-1 ${ + disabled + ? 'border-zinc-800 bg-black/30' + : active + ? 'border-amber-500/70 bg-amber-500/15' + : 'border-zinc-700/60 bg-titan/80' + }`} + activeOpacity={0.7} + > + + {label} + + +); + +const ChipRow = ({ children }: { children: React.ReactNode }) => ( + + {children} + +); + +const LABEL_W = 132; + +interface NumRowProps { + label: string; + value: string; + onChange: (s: string) => void; + placeholder?: string; + width?: number; +} +const NumRow = ({ label, value, onChange, placeholder, width = 58 }: NumRowProps) => ( + + + {label} + + + +); + +export default function RecipeCreateModal({ + visible, + currentBase, + onClose, + onSave, +}: RecipeCreateModalProps) { + const insets = useSafeAreaInsets(); + // Seed from the current film sim (or PROVIA) so "other params" start at the + // sim's standard values and the user only types what they want to change. + const seedBase: BaseFilter = + currentBase && FILM_SIMS.some((s) => s.baseFilter === currentBase) ? currentBase : 'provia'; + const seedAdj = FILM_SIMS.find((s) => s.baseFilter === seedBase)?.adjustments ?? DEFAULT_ADJUSTMENTS; + + // Every sim's standard values as form state — used to seed the modal and to + // reload the form when the SIMULATION chip changes. + const valuesOf = (b: BaseFilter) => { + const s = FILM_SIMS.find((x) => x.baseFilter === b)?.adjustments ?? DEFAULT_ADJUSTMENTS; + return { + dr: String(s.dynamicRange ?? 'auto'), + grain: String(s.grain === 0 ? 0 : s.grain >= 6 ? 6 : 3), + cc: s.colorChrome ?? 'none', + ccb: s.colorChromeBlue ?? 'none', + wbKey: WB_KEYS.find((k) => { + const p = WB_PRESETS.find((w) => w.key === k)!; + return p.temperature === s.temperature && p.tint === s.tint; + }) ?? 'auto', + highlight: String(s.highlight), + shadow: String(s.shadow), + color: String(s.saturation), + nr: String(s.denoise), + sharp: String(s.sharpening), + clarity: String(s.clarity), + ev: String(s.exposureCompensation), + }; + }; + + const [sim, setSim] = useState(seedBase); + const [name, setName] = useState(''); + const [dr, setDr] = useState(seedAdj.dynamicRange == null ? 'auto' : String(seedAdj.dynamicRange)); + const [grain, setGrain] = useState(String(seedAdj.grain === 0 ? 0 : seedAdj.grain >= 6 ? 6 : 3)); + const [cc, setCc] = useState(seedAdj.colorChrome ?? 'none'); + const [ccb, setCcb] = useState(seedAdj.colorChromeBlue ?? 'none'); + const [wbKey, setWbKey] = useState( + WB_KEYS.find((k) => { + const p = WB_PRESETS.find((w) => w.key === k)!; + return p.temperature === seedAdj.temperature && p.tint === seedAdj.tint; + }) ?? 'auto' + ); + const [wbRed, setWbRed] = useState('0'); + const [wbBlue, setWbBlue] = useState('0'); + const [fHigh, setFHigh] = useState(String(seedAdj.highlight)); + const [fShadow, setFShadow] = useState(String(seedAdj.shadow)); + const [fColor, setFColor] = useState(String(seedAdj.saturation)); + const [fNr, setFNr] = useState(String(seedAdj.denoise)); + const [fSharp, setFSharp] = useState(String(seedAdj.sharpening)); + const [fClarity, setFClarity] = useState(String(seedAdj.clarity)); + const [fEv, setFEv] = useState(String(seedAdj.exposureCompensation)); + const [iso, setIso] = useState(null); + + // Re-seed whenever the modal opens (or the applied look changes) so CREATE + // quick-input always starts from the current simulation. + useEffect(() => { + if (!visible) return; + const v = valuesOf(seedBase); + setSim(seedBase); + setDr(v.dr); + setGrain(v.grain); + setCc(v.cc); + setCcb(v.ccb); + setWbKey(v.wbKey); + setWbRed('0'); + setWbBlue('0'); + setFHigh(v.highlight); + setFShadow(v.shadow); + setFColor(v.color); + setFNr(v.nr); + setFSharp(v.sharp); + setFClarity(v.clarity); + setFEv(v.ev); + setName(''); + setIso(null); + }, [visible, currentBase]); + + // Switching the simulation reloads its standard values into the form. + const selectSim = (b: BaseFilter) => { + setSim(b); + const v = valuesOf(b); + setDr(v.dr); + setGrain(v.grain); + setCc(v.cc); + setCcb(v.ccb); + setWbKey(v.wbKey); + setFHigh(v.highlight); + setFShadow(v.shadow); + setFColor(v.color); + setFNr(v.nr); + setFSharp(v.sharp); + setFClarity(v.clarity); + setFEv(v.ev); + }; + + const handleSave = () => { + const wb = WB_PRESETS.find((w) => w.key === wbKey) ?? WB_PRESETS[0]; + const simAdj = FILM_SIMS.find((s) => s.baseFilter === sim)?.adjustments ?? DEFAULT_ADJUSTMENTS; + const adj: ColorAdjustments = { + ...DEFAULT_ADJUSTMENTS, + ...simAdj, + temperature: wb.temperature, + tint: wb.tint, + wbRed: int(wbRed, 0, -9, 9), + wbBlue: int(wbBlue, 0, -9, 9), + highlight: int(fHigh, simAdj.highlight, -10, 10), + shadow: int(fShadow, simAdj.shadow, -10, 10), + saturation: int(fColor, simAdj.saturation, -10, 10), + denoise: int(fNr, simAdj.denoise, 0, 10), + sharpening: int(fSharp, simAdj.sharpening, 0, 10), + clarity: int(fClarity, simAdj.clarity, -10, 10), + grain: parseInt(grain, 10), + colorChrome: cc as ColorAdjustments['colorChrome'], + colorChromeBlue: ccb as ColorAdjustments['colorChromeBlue'], + dynamicRange: (dr === 'auto' ? 'auto' : parseInt(dr, 10)) as ColorAdjustments['dynamicRange'], + exposureCompensation: int(fEv, simAdj.exposureCompensation, -3, 3), + }; + onSave({ + name: name.trim() || 'NEW RECIPE', + baseFilter: sim, + adjustments: adj, + frameId: 'none', + useGeotag: true, + }); + setName(''); + onClose(); + }; + + const fieldSets: { label: string; value: string; set: (s: string) => void; ph?: string }[] = [ + { label: 'HIGHLIGHT', value: fHigh, set: setFHigh }, + { label: 'SHADOW', value: fShadow, set: setFShadow }, + { label: 'COLOR', value: fColor, set: setFColor }, + { label: 'NOISE RED.', value: fNr, set: setFNr, ph: '0-10' }, + { label: 'SHARPENING', value: fSharp, set: setFSharp, ph: '0-10' }, + { label: 'CLARITY', value: fClarity, set: setFClarity }, + { label: 'EXPOSURE COMP.', value: fEv, set: setFEv, ph: 'EV' }, + ]; + + return ( + + + + + + CREATE RECIPE + + ✕ + + + + + {/* Name */} + NAME + + + {/* Simulation */} + SIMULATION + + {FILM_SIMS.map((s) => ( + selectSim(s.baseFilter)} /> + ))} + + + {/* Dynamic range */} + DYNAMIC RANGE + + {DR_OPTS.map((o) => ( + setDr(o.v)} /> + ))} + + + {/* Numeric textboxes — 2 per row */} + + {fieldSets.map((f) => ( + + ))} + + + {/* Grain / chrome */} + + GRAIN EFFECT + + {GRAIN_OPTS.map((o) => ( + setGrain(o.v)} /> + ))} + + COLOR CHROME EFFECT + + {CC_OPTS.map((o) => ( + setCc(o.v)} /> + ))} + + COLOR CHROME EFFECT BLUE + + {CC_OPTS.map((o) => ( + setCcb(o.v)} /> + ))} + + + + {/* White balance + R/B shift */} + WHITE BALANCE + + {WB_PRESETS.map((w) => ( + setWbKey(w.key)} /> + ))} + + + + WB SHIFT + + RED + + BLUE + + + + {/* ISO */} + + + ISO + + {ISO_SUPPORTED ? ( + + setIso(null)} /> + {ISO_STOPS.map((s) => ( + setIso(s)} /> + ))} + + ) : ( + {}} /> + )} + + + + + + CANCEL + + + SAVE RECIPE + + + + + + ); +} diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx new file mode 100644 index 0000000..949ad51 --- /dev/null +++ b/src/components/SettingsModal.tsx @@ -0,0 +1,176 @@ +import React from 'react'; +import { View, Text, Modal, TouchableOpacity } from 'react-native'; +import * as Haptics from 'expo-haptics'; +import { X, Volume2, Settings as SettingsIcon } from 'lucide-react-native'; +import { AspectRatio, MeterMode, ShutterSound } from '../types'; + +// Gear-sheet (gear button between library picker and shutter). Groups the +// capture/composition choices that are NOT look-adjustments, so the tool rail +// keeps only the image tools: shutter sound, composition ratio + RAW DNG +// sidecar, and full-frame metering mode (ex-FOCUS tab → METERING MODE). +interface Chip { + key: string; + label: string; + active: boolean; + onPress: () => void; + disabled?: boolean; // informational chip, not tappable (CAMERA ONLY etc.) +} + +const haptic = () => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + +interface SettingsModalProps { + visible: boolean; + onClose: () => void; + aspectRatio: AspectRatio; + onAspectRatio: (ratio: AspectRatio) => void; + rawEnabled: boolean; + onRawEnabled: (enabled: boolean) => void; + cameraMode: boolean; + meterMode: MeterMode; + onMeterModeChange: (mode: MeterMode) => void; + shutterSound: ShutterSound; + onShutterSound: (sound: ShutterSound) => void; +} + +function ChipRow({ chips }: { chips: Chip[] }) { + return ( + + {chips.map((c) => + c.disabled ? ( + + {c.label} + + ) : ( + { haptic(); c.onPress(); }} + activeOpacity={0.7} + className={`mx-1 flex-row items-center rounded-full border px-3 py-1.5 ${ + c.active ? 'border-amber-500/70 bg-amber-500/15' : 'border-zinc-700/60 bg-titan/80' + }`} + > + + {c.label} + + + ) + )} + + ); +} + +function SectionLabel({ children }: { children: string }) { + return ( + {children} + ); +} + +function CameraOnlyNote({ cameraMode }: { cameraMode: boolean }) { + if (cameraMode) return null; + return CAMERA ONLY; +} + +export default function SettingsModal({ + visible, + onClose, + aspectRatio, + onAspectRatio, + rawEnabled, + onRawEnabled, + cameraMode, + meterMode, + onMeterModeChange, + shutterSound, + onShutterSound, +}: SettingsModalProps) { + return ( + + + + + + + + + SETTINGS + + + + + + + + {/* Shutter sound */} + + SHUTTER SOUND + onShutterSound('on') }, + { key: 'snd-off', label: 'OFF', active: shutterSound === 'off', onPress: () => onShutterSound('off') }, + ]} + /> + + + + Android has no click-volume control — OFF only. Some regions force the sound on by OS policy. + + + + + {/* Composition ratio + RAW */} + + PHOTO RATIO + onAspectRatio('full') }, + { key: 'ratio-4:3', label: '4:3', active: aspectRatio === '4:3', onPress: () => onAspectRatio('4:3') }, + { key: 'ratio-3:2', label: '3:2', active: aspectRatio === '3:2', onPress: () => onAspectRatio('3:2') }, + ]} + /> + + onRawEnabled(!rawEnabled) } + : { key: 'raw', label: rawEnabled ? 'RAW DNG ON' : 'RAW DNG OFF', active: rawEnabled, disabled: true, onPress: () => {} }, + ]} + /> + + + + + {/* Metering mode */} + + METERING MODE + onMeterModeChange('evaluative') } + : { key: 'meter-eval', label: 'EVALUATIVE', active: meterMode === 'evaluative', disabled: true, onPress: () => {} }, + cameraMode + ? { key: 'meter-hl', label: 'HIGHLIGHT-WEIGHTED', active: meterMode === 'highlight', onPress: () => onMeterModeChange('highlight') } + : { key: 'meter-hl', label: 'HIGHLIGHT-WEIGHTED', active: meterMode === 'highlight', disabled: true, onPress: () => {} }, + ]} + /> + + + + + + ); +} diff --git a/src/components/ToolRail.tsx b/src/components/ToolRail.tsx index 0ea326f..0997ce8 100644 --- a/src/components/ToolRail.tsx +++ b/src/components/ToolRail.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { View, Text, TouchableOpacity, ScrollView } from 'react-native'; -import { LayoutGrid, Sun, Thermometer, Sparkles, Frame, Ratio, type LucideIcon } from 'lucide-react-native'; +import { LayoutGrid, Sun, Thermometer, Sparkles, Frame, type LucideIcon } from 'lucide-react-native'; import * as Haptics from 'expo-haptics'; -export type TabId = 'recipes' | 'iq' | 'wb' | 'filters' | 'frame' | 'ratio'; +export type TabId = 'recipes' | 'iq' | 'wb' | 'filters' | 'frame'; interface ToolRailProps { activeTab: TabId | null; @@ -16,7 +16,6 @@ const TOOLS: { id: TabId; label: string; icon: LucideIcon }[] = [ { id: 'wb', label: 'WB', icon: Thermometer }, { id: 'filters', label: 'FX', icon: Sparkles }, { id: 'frame', label: 'FRAME', icon: Frame }, - { id: 'ratio', label: 'RATIO', icon: Ratio }, ]; export default function ToolRail({ activeTab, onToggle }: ToolRailProps) { diff --git a/src/components/Viewfinder.tsx b/src/components/Viewfinder.tsx index 3c0156a..fdc1c8c 100644 --- a/src/components/Viewfinder.tsx +++ b/src/components/Viewfinder.tsx @@ -23,7 +23,7 @@ import { MipmapMode, } from '@shopify/react-native-skia'; import { Lock } from 'lucide-react-native'; -import { Recipe, GPSInfo, FrameId, AspectRatio, ASPECT_RATIO_W_H } from '../types'; +import { Recipe, GPSInfo, FrameId, AspectRatio, ColorAdjustments, ASPECT_RATIO_W_H } from '../types'; import { getSkiaColorMatrix, applyExposureGain } from '../utils/colorUtils'; import { TONE_SKSL, getToneUniforms } from '../utils/toneShader'; import { CINEMA_SKSL, getCinemaUniforms, cinemaOffFlat } from '../utils/cinemaShader'; @@ -52,6 +52,31 @@ interface ViewfinderProps { onSessionError?: (error: Error) => void; // Quick exposure slider (shown while AE/AF is locked) — live AE bias in EV. onExposureChange?: (ev: number) => void; + // Metering-mode EV offset (highlight-weighted): extra EV stops ADDED on top + // of the recipe EV. Applied to the preview matrix AND the capture-time AE + // flush so preview/export/capture agree; the EV slider UI keeps showing the + // raw user EV. Negative = protect highlights. 0 = off. + meteringEvOffset?: number; + // Metering-mode tonal look (highlight-weighted): small extra adjustments + // merged on top of the recipe for RENDERING only (preview matrix + tone, and + // App mirrors it into the export). Real highlight-weighted metering (GR / + // Sony) doesn't only underexpose — it meters for the BRIGHTEST area to keep + // its detail (absolute no-blowout): highlight roll, deep shadow crush, raised + // contrast/clarity. Never contains exposureCompensation (that rides the EV + // offset above); UI sliders keep showing the raw recipe. + meteringAdjustments?: Partial; + // Continuous panel parameter whose slider row is open (App lifts it from the + // AdjustmentPanel). While set, a vertical drag ANYWHERE on the live image + // adjusts this parameter (up = increase) — no need to grab the small slider. + // Null while no param row is open; then a locked-AE drag adjusts EV instead. + imageAdjustTarget?: { + key: string; + min: number; + max: number; + step: number; + value: number; + onChange: (v: number) => void; + } | null; } export interface ViewfinderHandle { @@ -81,7 +106,7 @@ const toneEffect = (() => { try { return Skia.RuntimeEffect.Make(TONE_SKSL); } catch (e) { - console.error('[camtone] TONE_SKSL compile failed: ' + e); + console.error('TONE_SKSL compile failed: ' + e); return null; } })(); @@ -90,7 +115,7 @@ const cinemaEffect = (() => { try { return Skia.RuntimeEffect.Make(CINEMA_SKSL); } catch (e) { - console.error('[cinema] CINEMA_SKSL compile failed: ' + e); + console.error('CINEMA_SKSL compile failed: ' + e); return null; } })(); @@ -118,6 +143,9 @@ const Viewfinder = forwardRef(function Viewfi rawOutput, onSessionError, onExposureChange, + meteringEvOffset = 0, + meteringAdjustments, + imageAdjustTarget, }: ViewfinderProps, ref ) { @@ -212,14 +240,20 @@ const Viewfinder = forwardRef(function Viewfi Math.round(vw * 0.032) ); - const adjustments = recipe.adjustments; + const adjustments = meteringAdjustments + ? { ...recipe.adjustments, ...meteringAdjustments } + : recipe.adjustments; // Exposure compensation, applied as software 2^EV matrix gain for BOTH modes. // Camera AE bias is only flushed to hardware at capture time // (flushExposureBias): setting it live per slider value re-locks AE on the // Xiaomi and flashes the preview (matrix change is instant and flicker-free). + // Metering offset (highlight-weighted) rides on top of the user EV so the + // preview shows the protected-exposure look; EV_RANGE ±3 caps the software + // gain (flush clamps to the device range separately). + const evApplied = Math.max(-3, Math.min(3, (adjustments.exposureCompensation ?? 0) + meteringEvOffset)); const colorMatrix = applyExposureGain( getSkiaColorMatrix(recipe.baseFilter, adjustments), - adjustments.exposureCompensation ?? 0 + evApplied ); // The Skia onFrame worklet runs on a separate runtime — keep the latest color @@ -259,6 +293,15 @@ const Viewfinder = forwardRef(function Viewfi // flicker-free (preview EV is software matrix gain). const skiaCameraRef = useRef(null); const [cameraActive, setCameraActive] = useState(false); + // Stable identities so React.memo(SkiaCameraImpl) does not re-render (and + // re-run its frame-output setup) on every adjustments change during slider + // drags — inline lambdas here used to break memo and stall the main thread. + const handleCameraStarted = useCallback(() => { + setCameraActive(true); + }, []); + const handleCameraStopped = useCallback(() => { + setCameraActive(false); + }, []); // Camera session pauses when the app backgrounds; toggling isActive back on // resume restarts it. Without this the preview stayed black after unlock. const [appActive, setAppActive] = useState(AppState.currentState === 'active'); @@ -275,15 +318,16 @@ const Viewfinder = forwardRef(function Viewfi // per intermediate value — each one cancelled by the next, spamming [ev]). const evStopsRef = useRef(evStops); evStopsRef.current = evStops; + // Metering offset mirrored into a ref: flushExposureBias is a stable + // imperative handle (useImperativeHandle deps [ref]) and must read the LIVE + // offset when the user switches metering mode. + const meteringEvOffsetRef = useRef(meteringEvOffset); + meteringEvOffsetRef.current = meteringEvOffset; useEffect(() => { if (!controller) return; const d = controller.device; - if (d && d.supportsExposureBias) { - console.error( - `[ev] device range=${d.minExposureBias}..${d.maxExposureBias} current=${controller.exposureBias}` - ); - } else { - console.error(`[ev] device has no exposure bias support`); + if (d && !d.supportsExposureBias) { + console.warn('Device has no exposure-bias support — EV applies to preview and export only.'); } }, [controller]); // Hardware AE bias is applied ONLY at capture time via flushExposureBias() @@ -300,17 +344,16 @@ const Viewfinder = forwardRef(function Viewfi const ctl = skiaCameraRef.current?.controller; const d = ctl?.device; if (!ctl || !d || !d.supportsExposureBias) return; - const ev = evStopsRef.current; + const ev = evStopsRef.current + meteringEvOffsetRef.current; const index = Math.round(ev * 8); const clamped = Math.max(d.minExposureBias, Math.min(d.maxExposureBias, index)); if (clamped === ctl.exposureBias) return; for (let attempt = 1; attempt <= 3; attempt++) { try { await ctl.setExposureBias(clamped); - console.error(`[ev] flush ev=${ev} idx=${clamped} ok, read=${ctl.exposureBias}`); return; } catch (e) { - console.error(`[ev] flush ev=${ev} idx=${clamped} attempt=${attempt} failed: ${String(e).slice(0, 100)}`); + console.warn(`Exposure-bias flush failed (attempt ${attempt}): ${String(e).slice(0, 100)}`); await new Promise((r) => setTimeout(r, 80)); } } @@ -330,7 +373,7 @@ const Viewfinder = forwardRef(function Viewfi const d = cam?.controller?.device; if (!d) return; if (!d.supportsFocusMetering && !d.supportsExposureMetering && !d.supportsWhiteBalanceMetering) { - console.error('[focus] metering unsupported on this device'); + console.warn('Focus/exposure metering unsupported on this device'); return; } setFocusPoint({ x, y }); @@ -339,9 +382,8 @@ const Viewfinder = forwardRef(function Viewfi { x, y }, { responsiveness: 'snappy', adaptiveness: 'locked', autoResetAfter: null } ); - console.error(`[focus] tap=${Math.round(x)},${Math.round(y)} AE/AF/AWB locked`); } catch (e) { - console.error('[focus] lock failed: ' + String(e).slice(0, 120)); + console.warn('Focus lock failed: ' + String(e).slice(0, 120)); } }; const handleUnlockFocus = async () => { @@ -350,9 +392,8 @@ const Viewfinder = forwardRef(function Viewfi try { await cam.resetFocus(); setFocusPoint(null); - console.error('[focus] reset to continuous auto'); } catch (e) { - console.error('[focus] reset failed: ' + String(e).slice(0, 120)); + console.warn('Focus reset failed: ' + String(e).slice(0, 120)); } }; @@ -365,41 +406,114 @@ const Viewfinder = forwardRef(function Viewfi const evPxPerStop = evTrackH / (2 * EV_RANGE); const clampEv = (v: number) => Math.max(-EV_RANGE, Math.min(EV_RANGE, v)); const evDragRef = useRef<{ y0: number; ev0: number } | null>(null); + // Last EV value actually pushed to App. Quick-EV drags otherwise fire a full + // adjustments re-render on EVERY pointer move (30-60Hz), even while the + // finger holds a step without the value changing — that render storm stalls + // the main thread and beats the Skia preview. Only push real nấc changes. + const evLastSentRef = useRef(null); const evThumbY = evTrackTop + ((EV_RANGE - clampEv(evStops)) / (2 * EV_RANGE)) * evTrackH; + // Screen-absolute Y of the gesture. locationY is relative to whichever view + // the finger currently hit-tests over, so crossing the small track's edge + // mid-drag changed the origin by the track offset and snapped EV by ~3 stops + // (the "jumps to the other end" bug). pageY never moves. + const pageYOf = (e: any): number => { + const t = e?.nativeEvent?.touches?.[0]; + if (t && typeof t.pageY === 'number') return t.pageY; + const p = e?.nativeEvent?.pageY; + if (typeof p === 'number') return p; + return e?.nativeEvent?.locationY ?? 0; + }; const onEvSliderGrant = (e: any) => { - evDragRef.current = { y0: e.nativeEvent.locationY, ev0: evStops }; + const y0 = pageYOf(e); + evDragRef.current = { y0, ev0: evStops }; + evLastSentRef.current = evStops; }; const onEvSliderMove = (e: any) => { const g = evDragRef.current; if (!g || !onExposureChange) return; - const dy = g.y0 - e.nativeEvent.locationY; // drag up = brighter + const dy = g.y0 - pageYOf(e); // drag up = brighter const ev = clampEv(g.ev0 + dy / evPxPerStop); - onExposureChange(Math.round(ev * 10) / 10); + const rounded = Math.round(ev * 10) / 10; + if (rounded === evLastSentRef.current) return; // same step: skip re-render + evLastSentRef.current = rounded; + onExposureChange(rounded); }; const onEvSliderRelease = () => { evDragRef.current = null; }; - // Instrumentation for device logs (user captures only logcat E level, so - // console.log/warn never show up — these are error-level on purpose). - const lastPreviewLog = useRef(0); - useEffect(() => { - const now = Date.now(); - if (now - lastPreviewLog.current < 400) return; - lastPreviewLog.current = now; - console.error( - `[preview] matrix=(${colorMatrix[0].toFixed(3)},${colorMatrix[5].toFixed(3)},${colorMatrix[10].toFixed(3)}) tone=[${toneParams.join(',')}] ev=${evStops}` - ); - }, [colorMatrix, toneParams, evStops]); + // ---- Drag-anywhere-on-the-image adjustment -------------------------------- + // Priority: an open panel param row (imageAdjustTarget) > EV (AE locked). + // A plain tap (no movement) always falls through to tap-to-focus. + const TAP_SLOP = 14; // px of movement before a touch counts as a drag + const imageAdjustTargetRef = useRef(imageAdjustTarget); + imageAdjustTargetRef.current = imageAdjustTarget; + type ImgDragSession = { + y0: number; + kind: 'param' | 'ev' | 'focus'; + v0: number; + param: { min: number; max: number; step: number; onChange: (v: number) => void }; + moved: boolean; + lastSent: number | null; + }; + const imgDragRef = useRef(null); + const onImageDragGrant = (e: any) => { + const t = imageAdjustTargetRef.current; + let kind: ImgDragSession['kind'] = 'focus'; + let v0 = 0; + let param: ImgDragSession['param'] = { min: 0, max: 0, step: 0, onChange: () => {} }; + if (t) { + kind = 'param'; + v0 = t.value; + param = { min: t.min, max: t.max, step: t.step, onChange: t.onChange }; + } else if (focusPoint && onExposureChange) { + kind = 'ev'; + v0 = evStops; + } + imgDragRef.current = { y0: pageYOf(e), kind, v0, param, moved: false, lastSent: null }; + }; + const onImageDragMove = (e: any) => { + const g = imgDragRef.current; + if (!g || g.kind === 'focus') return; + const dy = g.y0 - pageYOf(e); // up = positive / increase + if (!g.moved) { + if (Math.abs(dy) < TAP_SLOP) return; + g.moved = true; + } + if (g.kind === 'ev') { + if (!onExposureChange) return; + const ev = clampEv(g.v0 + dy / evPxPerStop); + const rounded = Math.round(ev * 10) / 10; + if (rounded === g.lastSent) return; + g.lastSent = rounded; + evLastSentRef.current = rounded; + onExposureChange(rounded); + return; + } + const range = g.param.max - g.param.min; + let v = g.v0 + (dy * range) / evTrackH; // same feel as the EV track + v = Math.max(g.param.min, Math.min(g.param.max, v)); + if (g.param.step > 0) v = Math.round(v / g.param.step) * g.param.step; + const rounded = Math.round(v * 1000) / 1000; + if (rounded === g.lastSent) return; + g.lastSent = rounded; + g.param.onChange(rounded); + }; + const onImageDragEnd = (e: any) => { + const g = imgDragRef.current; + imgDragRef.current = null; + if (!g) return; + if (!g.moved) { + // Plain tap: lock focus at the tapped point (drag never re-locks). + handleTapFocus(e.nativeEvent.locationX, e.nativeEvent.locationY); + } + }; // Camera frame renderer. Stable identity (empty-ish deps): SkiaCamera re-runs // its frame pipeline whenever onFrame changes, which during slider drags made // the preview flicker. All live values flow through the synchronizables. type SkiaCameraOnFrame = NonNullable['onFrame']>; const toneFailLogged = useMemo(() => createSynchronizable(false), []); - // DEBUG-4x3 (remove after diagnosis): log actual stream geometry at runtime. - const dbgCountSync = useMemo(() => createSynchronizable(0), []); - const dbgLastSync = useMemo(() => createSynchronizable(''), []); // Composition band fed to the frame worklet: [active, viewAspect, fx, fy, // fw, fh] where (fx,fy,fw,fh) is the photo-area rect (ratio band / polaroid // window / wall window) normalized to the view. While active the worklet @@ -418,10 +532,23 @@ const Viewfinder = forwardRef(function Viewfi (frame, render) => { 'worklet'; render(({ canvas, frameTexture }) => { + // Quick-EV drags write colorMatrixSync from JS on every tick; a torn + // read can throw inside MakeMatrix (or yield NaN -> black surface) for + // one frame. Validate + try/catch, fall back to identity (no filter): + // a 1-frame gain error beats a 1-frame black beat. DEBUG-EV. const paint = Skia.Paint(); - paint.setColorFilter(Skia.ColorFilter.MakeMatrix(colorMatrixSync.getBlocking())); - const tone = toneSync.getBlocking(); - const cinema = cinemaSync.getBlocking(); + try { + const cm = colorMatrixSync.getDirty(); + if (cm != null && cm.length === 20 && cm.every((v) => typeof v === 'number' && Number.isFinite(v))) { + paint.setColorFilter(Skia.ColorFilter.MakeMatrix(cm)); + } else { + console.warn('Invalid color matrix (len ' + (cm == null ? 'null' : cm.length) + ') — filter skipped'); + } + } catch (e) { + console.warn('Color matrix build failed: ' + e); + } + const tone = toneSync.getDirty(); + const cinema = cinemaSync.getDirty(); const hasTone = toneEffect != null && (tone[0] !== 0 || tone[1] !== 0 || tone[2] !== 0); const hasCinema = cinemaEffect != null && cinema[0] > 0; // Draws the full frame with the tone/cinema shader when active (drawRect, @@ -450,7 +577,7 @@ const Viewfinder = forwardRef(function Viewfi } catch (e) { if (!toneFailLogged.getBlocking()) { toneFailLogged.setBlocking(true); - console.error('[camtone] shader failed, matrix-only: ' + e); + console.error('Tone shader failed, matrix-only: ' + e); } } } @@ -463,21 +590,12 @@ const Viewfinder = forwardRef(function Viewfi // (under the renderToTexture rotation/mirror CTM) and cover-map the // sensor there. Equal-aspect bands (ratio 4:3 == native 3:4 sensor) // then show the ENTIRE sensor; narrower bands crop like the export. - const feed = feedRectSync.getBlocking(); + const feed = feedRectSync.getDirty(); const ftW = frameTexture.width(); const ftH = frameTexture.height(); const orient = frame.orientation; - const dbgMir = frame.isMirrored === true; - const dbgCount = dbgCountSync.getBlocking(); - dbgCountSync.setBlocking(dbgCount + 1); const bandActive = feed[0] > 0; if (!bandActive) { - // DEBUG-4x3 (remove): stream ground truth, no-band branch - const line = `ft=${ftW}x${ftH} o=${orient} mir=${dbgMir} band=0 feed=[${feed.map((f) => f.toFixed(3)).join(',')}]`; - if (dbgCount % 60 === 0 || line !== dbgLastSync.getBlocking()) { - dbgLastSync.setBlocking(line); - console.error('[camdebug] ' + line); - } drawFullFrame(); return; } @@ -549,12 +667,6 @@ const Viewfinder = forwardRef(function Viewfi const dh = s * ftH; const dx = u0 + (rw - dw) / 2; const dy = v0 + (rh - dh) / 2; - // DEBUG-4x3 (remove): full geometry log for the band branch - const line = `ft=${ftW}x${ftH} o=${orient} mir=${dbgMir} band=1 feed=[${feed.map((f) => f.toFixed(3)).join(',')}] up=${ow}x${oh} ac=${ac.toFixed(4)} vis=${visX.toFixed(3)}x${visY.toFixed(3)} X0=${X0.toFixed(0)} Y0=${Y0.toFixed(0)} X1=${X1.toFixed(0)} Y1=${Y1.toFixed(0)} raw=${u0.toFixed(0)},${v0.toFixed(0)} ${rw.toFixed(0)}x${rh.toFixed(0)} s=${s.toFixed(4)} d=${dx.toFixed(0)},${dy.toFixed(0)}`; - if (dbgCount % 60 === 0 || line !== dbgLastSync.getBlocking()) { - dbgLastSync.setBlocking(line); - console.error('[camdebug] ' + line); - } // Fresh paint; its default color is opaque black (Skia default), so // the surface fill below needs no explicit color set. const blackPaint = Skia.Paint(); @@ -644,19 +756,6 @@ const Viewfinder = forwardRef(function Viewfi : [0, 0, 0, 0, 0, 0] ); }, [cameraPhotoRect, vw, vh, feedRectSync]); - // DEBUG-4x3 (remove): correlate JS view/region state with the worklet log. - useEffect(() => { - console.error( - '[camdebug-js] region=' + JSON.stringify(region) + - ' band=' + regionBand + - ' ratio=' + aspectRatio + - ' frame=' + selectedFrame + - ' view=' + vw + 'x' + vh + - ' feed=' + (cameraPhotoRect ? JSON.stringify([1, vw / vh, cameraPhotoRect.x / vw, cameraPhotoRect.y / vh, cameraPhotoRect.w / vw, cameraPhotoRect.h / vh]) : 'null') + - ' frameTarget=' + (frameTarget ? frameTarget.width + 'x' + frameTarget.height : 'null') - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [region, regionBand, aspectRatio, selectedFrame, cameraPhotoRect]); const onLibTouchStart = (e: any) => { const ts = e.nativeEvent.touches; if (ts.length >= 2) { @@ -981,16 +1080,21 @@ const Viewfinder = forwardRef(function Viewfi outputs={cameraOutputs} pixelFormat="yuv" targetResolution={frameTarget} - onStarted={() => setCameraActive(true)} + onStarted={handleCameraStarted} + onStopped={handleCameraStopped} onFrame={handleFrame} onError={onSessionError} /> - {/* Tap-to-focus layer: fullscreen responder (all visual overlays above - are pointerEvents none). locationX/Y are relative to this view. */} + {/* Gesture layer: tap = AE/AF lock; vertical drag on the image adjusts + the open panel parameter (or EV while AE is locked). Sits below the + quick-EV strip, which keeps its own narrower direct-drag handle. */} true} - onResponderGrant={(e) => handleTapFocus(e.nativeEvent.locationX, e.nativeEvent.locationY)} + onResponderGrant={onImageDragGrant} + onResponderMove={onImageDragMove} + onResponderRelease={onImageDragEnd} + onResponderTerminate={onImageDragEnd} /> {focusPoint && ( , number> = { '4:3': 3 / 4, @@ -16,12 +34,16 @@ export const ASPECT_RATIO_W_H: Record, number> = { // cool tint in shade, plus a seasonal atmospheric haze/fog veil. export type CinemaSeason = 'spring' | 'summer' | 'autumn' | 'winter'; +export type BaseFilter = 'classic-neg' | 'classic-chrome' | 'provia' | 'velvia' | 'astia' | 'eterna' | 'monochrome' | 'none'; + export interface ColorAdjustments { exposure: number; // -10 to +10 (mapped to matrix multiplier or offset) contrast: number; // -10 to +10 saturation: number; // -10 to +10 temperature: number; // 2500 to 10000 (Kelvin) tint: number; // -10 to +10 + wbRed?: number; // Fuji WB fine-tune, Red axis (-9..9) — extra red-channel gain + wbBlue?: number; // Fuji WB fine-tune, Blue axis (-9..9) — extra blue-channel gain highlight: number; // -10 to +10 (- pulls highlights down / roll, + brightens) shadow: number; // -10 to +10 (+ lifts shadows, - deepens) denoise: number; // 0 to 10 (mapped to blur sigma) @@ -38,7 +60,7 @@ export interface Recipe { id: string; name: string; isCustom?: boolean; - baseFilter: 'classic-neg' | 'provia' | 'velvia' | 'monochrome' | 'none'; + baseFilter: BaseFilter; adjustments: ColorAdjustments; frameId?: FrameId; // e.g. 'none', 'polaroid', 'classic-white', 'cinematic', 'wallframe' cinema?: CinemaSeason | null; // seasonal atmosphere grade (optional) diff --git a/src/utils/colorUtils.ts b/src/utils/colorUtils.ts index 39d57aa..05c1778 100644 --- a/src/utils/colorUtils.ts +++ b/src/utils/colorUtils.ts @@ -1,6 +1,4 @@ -import { ColorAdjustments } from '../types'; - -export type BaseFilter = 'classic-neg' | 'provia' | 'velvia' | 'monochrome' | 'none'; +import { ColorAdjustments, BaseFilter } from '../types'; // Kelvin to RGB compensation for White Balance. // In photography, when WB is set HIGH (e.g. 10000K), the camera understands @@ -75,6 +73,31 @@ export function getSkiaColorMatrix(baseFilter: BaseFilter, adj: ColorAdjustments -0.05, -0.05, 1.25, 0, -0.02, 0, 0, 0, 1, 0, ]; + } else if (baseFilter === 'classic-chrome') { + // Classic Chrome: muted/deep color with strong tone — desaturated reds and + // greens, slight warm amber in highlights, shadows stay soft (approx). + matrix = [ + 1.12, -0.03, -0.06, 0, 0.04, + -0.04, 1.0, -0.03, 0, 0.03, + -0.05, -0.06, 0.86, 0, -0.02, + 0, 0, 0, 1, 0, + ]; + } else if (baseFilter === 'astia') { + // Astia: soft, gentle, flattering — low contrast, pastel-leaning colors. + matrix = [ + 1.0, 0.02, 0.02, 0, 0.01, + 0.01, 1.0, 0.02, 0, 0.02, + 0.01, 0.01, 1.02, 0, 0.02, + 0, 0, 0, 1, 0, + ]; + } else if (baseFilter === 'eterna') { + // Eterna: cinema — flat (low contrast), muted color, gentle highlight rolloff. + matrix = [ + 0.94, 0.02, 0.02, 0, 0.02, + 0.02, 0.96, 0.02, 0, 0.02, + 0.02, 0.02, 0.94, 0, 0.02, + 0, 0, 0, 1, 0, + ]; } else if (baseFilter === 'monochrome') { // Acros Monochrome: ITU-R BT.709 luma — pure grayscale, zero color leakage const r = 0.2126; @@ -148,6 +171,22 @@ export function getSkiaColorMatrix(baseFilter: BaseFilter, adj: ColorAdjustments matrix = multiplyMatrices(wbMat, matrix); } + // 5b. Fuji WB fine-tune Red/Blue axis (the CREATE modal's R/B offsets). These + // axes are independent channel gains on top of the Kelvin/tint preset: each + // step nudges its channel ~1.1% toward/away from neutral, matching the + // perceptible size of one Fuji fine-tune step (-9..+9). + const wbRed = adj.wbRed ?? 0; + const wbBlue = adj.wbBlue ?? 0; + if (baseFilter !== 'monochrome' && (wbRed !== 0 || wbBlue !== 0)) { + const shiftMat = [ + 1 + (wbRed / 9) * 0.1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 1 + (wbBlue / 9) * 0.1, 0, 0, + 0, 0, 0, 1, 0, + ]; + matrix = multiplyMatrices(shiftMat, matrix); + } + // 6. Exposure & Contrast — applied to ALL base filters (monochrome included) so // both keep affecting mono shots. Contrast scales around mid-grey 0.5. if (exposure !== 0 || contrast !== 0) { diff --git a/src/utils/defaultRecipes.ts b/src/utils/defaultRecipes.ts index 101c46c..dc71004 100644 --- a/src/utils/defaultRecipes.ts +++ b/src/utils/defaultRecipes.ts @@ -9,6 +9,8 @@ export const DEFAULT_ADJUSTMENTS: ColorAdjustments = { saturation: 0, temperature: 5500, tint: 0, + wbRed: 0, + wbBlue: 0, highlight: 0, shadow: 0, denoise: 0, @@ -21,6 +23,40 @@ export const DEFAULT_ADJUSTMENTS: ColorAdjustments = { exposureCompensation: 0, }; +// Standard Fuji film simulations. These are the fixed "look" presets shown at +// the front of the PRESETS chip row: tapping one applies the simulation via +// its baseFilter colour matrix ONLY — every other knob resets to its neutral +// default (0 / auto) so the sim is a clean starting point, never a baked +// recipe. Any look beyond the matrix (grain, DR, CC, contrast…) is added by +// the user afterwards. +export interface FilmSim { + id: string; // Recipe-like id used only while the sim is the current selection + name: string; + baseFilter: Recipe['baseFilter']; + adjustments: ColorAdjustments; +} + +export const FILM_SIMS: FilmSim[] = [ + { id: 'sim-provia', name: 'PROVIA', baseFilter: 'provia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-velvia', name: 'VELVIA', baseFilter: 'velvia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-classic-chrome', name: 'CLASSIC CHROME', baseFilter: 'classic-chrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-astia', name: 'ASTIA', baseFilter: 'astia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-eterna', name: 'ETERNA', baseFilter: 'eterna', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-acros', name: 'ACROS', baseFilter: 'monochrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, +]; + +// Film sim → full Recipe (never persisted; sims are applied on the fly). +export function filmSimToRecipe(sim: FilmSim): Recipe { + return { + id: sim.id, + name: sim.name, + baseFilter: sim.baseFilter, + adjustments: { ...sim.adjustments }, + frameId: 'none', + useGeotag: true, + }; +} + export const DEFAULT_RECIPES: Recipe[] = [ { id: 'classic-neg-default', diff --git a/src/utils/exportEngine.ts b/src/utils/exportEngine.ts index 8221835..a182ecc 100644 --- a/src/utils/exportEngine.ts +++ b/src/utils/exportEngine.ts @@ -13,6 +13,9 @@ import { patchJpegDpi } from './jpegDpi'; export interface ExportResult { uri: string; savedToLibrary: boolean; + // MediaLibrary asset id when the photo was saved to the gallery — lets the + // photo viewer's trash button remove the gallery copy too. + assetId?: string | null; } export interface ExportOptions { @@ -69,9 +72,7 @@ function screenSharpenImage(image: SkImage, amount = 0.5): SkImage { // Unique filename per export. A fixed path made every export share one URI, and // RN's cache (keyed by URI) then kept showing the previous photo in the // thumbnail after a new capture overwrote the file. A fresh URI per export busts -// that cache. Previous export file is deleted after the new one is written and -// gallery-saved, so at most one stale temp file can ever exist. -let lastExportPath: string | null = null; +// that cache. const nextExportFile = () => `${FileSystem.cacheDirectory}camrecipe_pro_export_${Date.now()}.jpg`; export async function processAndExportPhoto( @@ -82,10 +83,6 @@ export async function processAndExportPhoto( gpsInfo: GPSInfo | null, options?: ExportOptions ): Promise { - const t0 = Date.now(); - // Direct console.error templates (user log captures are E-level only). Steps - // use full static prefixes — release minification dropped step literals when - // they were passed through a wrapper, so no indirection here. try { // 1. Read source image file into Skia const skiaData = await Skia.Data.fromURI(sourceUri); @@ -99,13 +96,9 @@ export async function processAndExportPhoto( console.error('Failed to parse image from URI'); return null; } - console.error(`[export] decode ${Date.now() - t0}ms`); - let skImage = skImage0; let width = skImage.width(); let height = skImage.height(); - console.error(`[export] BEGIN ${width}x${height} ev=${recipe.adjustments.exposureCompensation ?? 0} evFromCamera=${options?.evFromCamera ?? false}`); - // 1b. Aspect-ratio crop (composition): center-largest upright crop of the // requested ratio. Runs BEFORE any processing so frame/GPS/grain/sharpen // all apply to exactly the pixels the user framed. Wall Frame is exempt — @@ -144,7 +137,6 @@ export async function processAndExportPhoto( skImage = cropped; width = cropW; height = cropH; - console.error(`[export] aspect-crop ${width}x${height}`); } // 2. Create offscreen canvas (GPU-backed when available — see createSurface) @@ -181,7 +173,7 @@ export async function processAndExportPhoto( try { toneEffect = Skia.RuntimeEffect.Make(TONE_SKSL); } catch (e) { - console.error('[export] TONE_SKSL compile failed - falling back to matrix-only: ' + e); + console.error('TONE_SKSL compile failed - falling back to matrix-only: ' + e); } if (toneEffect) { const imageShader = skImage.makeShaderOptions( @@ -194,10 +186,10 @@ export async function processAndExportPhoto( if (toneShader) { paint.setShader(toneShader); } else { - console.error('[export] tone shader build failed - falling back to matrix-only'); + console.error('Tone shader build failed - falling back to matrix-only'); } } else { - console.error('[export] TONE_SKSL compile failed - falling back to matrix-only'); + console.error('TONE_SKSL compile failed - falling back to matrix-only'); } } @@ -222,7 +214,7 @@ export async function processAndExportPhoto( } } } catch (e) { - console.error('[export] CINEMA_SKSL failed - skipped: ' + e); + console.error('CINEMA_SKSL failed - skipped: ' + e); } } @@ -462,7 +454,6 @@ export async function processAndExportPhoto( } // 9. Snapshot & Encode to JPEG (base64 string, no SkData round-trip) - console.error(`[export] composite ${Date.now() - t0}ms`); let resultImage = outputSurface.makeImageSnapshot(); // Sharpening knob (0..10) overrides the legacy boolean sharpen flag: // legacy camera captures keep sharpen:true → 0.5 fallback when knob is 0. @@ -471,7 +462,6 @@ export async function processAndExportPhoto( if (sharpenAmount > 0) { resultImage = screenSharpenImage(resultImage, sharpenAmount); } - console.error(`[export] sharpen ${Date.now() - t0}ms`); // Encode straight to raw JPEG bytes — no base64. The old path round-tripped // the whole 12MP frame through JS base64 decode/encode for the DPI patch and // then writeAsStringAsync, which alone took ~6s of the render. @@ -481,8 +471,6 @@ export async function processAndExportPhoto( console.error('Failed to encode image to JPEG'); return null; } - console.error(`[export] encode ${Date.now() - t0}ms`); - // 9b. Patch DPI metadata (JFIF density / EXIF resolution) when requested — // in-place Uint8Array work, no base64 round-trip. if (options?.dpi && options.dpi > 0) { @@ -499,32 +487,23 @@ export async function processAndExportPhoto( console.error('Failed to write export file: ' + e); return null; } - console.error(`[export] write ${Date.now() - t0}ms`); - console.error(`[export] total-done ${Date.now() - t0}ms`); - - // 11. Request Media Library permission & Save to device gallery + // 11. Request Media Library permission & Save to device gallery. + // createAssetAsync (not saveToLibraryAsync) so the caller learns the + // gallery asset id — the photo viewer's trash button needs it to remove + // the saved copy. ponytail: old exports are NOT retired here anymore — the + // in-app photo history still references their cache files for the swipe + // viewer; the OS cache purge reclaims them eventually. const mediaPermission = await MediaLibrary.requestPermissionsAsync(); if (mediaPermission.granted) { try { - await MediaLibrary.saveToLibraryAsync(exportFile); - // New file is safely in the gallery — retire the previous export temp. - if (lastExportPath && lastExportPath !== exportFile) { - try { - await FileSystem.deleteAsync(lastExportPath, { idempotent: true }); - } catch (e) { - console.warn('Cleanup of previous export temp failed:', e); - } - } - lastExportPath = exportFile; - return { uri: exportFile, savedToLibrary: true }; + const asset = await MediaLibrary.createAssetAsync(exportFile); + return { uri: exportFile, savedToLibrary: true, assetId: asset.id }; } catch (e) { console.warn('Save to gallery failed:', e); } } else { console.warn('Media Library permission denied. Image saved to temporary cache only.'); } - console.error(`[export] gallery-save ${Date.now() - t0}ms`); - return { uri: exportFile, savedToLibrary: false }; } catch (error) { console.error('Error during photo processing and export:', error); diff --git a/src/utils/paramDefs.ts b/src/utils/paramDefs.ts new file mode 100644 index 0000000..69309b0 --- /dev/null +++ b/src/utils/paramDefs.ts @@ -0,0 +1,165 @@ +import { ColorAdjustments } from '../types'; + +// Static metadata for the continuous (slider) adjustments of the IQ/WB/FILTERS +// tabs — shared between AdjustmentPanel (chips + slider rows) and App (which +// needs the open row's bounds to drive drag-on-the-image adjustment). The get +// /set accessors are stateless so one table serves every render. +export interface ContinuousParamDef { + key: string; + label: string; + min: number; + max: number; + step: number; + defaultValue: number; + display: (v: number) => string; + get: (a: ColorAdjustments) => number; + set: (v: number) => Partial; +} + +const sign = (v: number) => (v > 0 ? `+${v}` : String(v)); +const oneEv = (v: number) => `${v > 0 ? '+' : ''}${v.toFixed(1)} EV`; + +export const PARAM_DEFS: { + iq: ContinuousParamDef[]; + wb: ContinuousParamDef[]; + filters: ContinuousParamDef[]; +} = { + iq: [ + { + key: 'exposure', + label: 'EXPOSURE', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.exposure, + set: (v) => ({ exposure: v }), + }, + { + key: 'ev', + label: 'EV', + min: -3, + max: 3, + step: 0.5, + defaultValue: 0, + display: oneEv, + get: (a) => a.exposureCompensation ?? 0, + set: (v) => ({ exposureCompensation: v }), + }, + { + key: 'contrast', + label: 'CONTRAST', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.contrast, + set: (v) => ({ contrast: v }), + }, + { + key: 'color', + label: 'COLOR', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.saturation, + set: (v) => ({ saturation: v }), + }, + { + key: 'highlight', + label: 'HIGHLIGHT', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.highlight ?? 0, + set: (v) => ({ highlight: v }), + }, + { + key: 'shadow', + label: 'SHADOW', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.shadow ?? 0, + set: (v) => ({ shadow: v }), + }, + ], + wb: [ + { + key: 'temperature', + label: 'COLOR TEMP', + min: 2500, + max: 10000, + step: 100, + defaultValue: 5500, + display: (v) => `${v}K`, + get: (a) => a.temperature, + set: (v) => ({ temperature: v }), + }, + { + key: 'tint', + label: 'TINT', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.tint ?? 0, + set: (v) => ({ tint: v }), + }, + ], + filters: [ + { + key: 'denoise', + label: 'NOISE REDUCTION', + min: 0, + max: 10, + step: 1, + defaultValue: 0, + display: String, + get: (a) => a.denoise, + set: (v) => ({ denoise: v }), + }, + { + key: 'clarity', + label: 'CLARITY', + min: -10, + max: 10, + step: 1, + defaultValue: 0, + display: sign, + get: (a) => a.clarity, + set: (v) => ({ clarity: v }), + }, + { + key: 'sharpening', + label: 'SHARPENING', + min: 0, + max: 10, + step: 1, + defaultValue: 0, + display: String, + get: (a) => a.sharpening ?? 0, + set: (v) => ({ sharpening: v }), + }, + { + key: 'grain', + label: 'MONOCHROME GRAIN', + min: 0, + max: 10, + step: 1, + defaultValue: 0, + display: String, + get: (a) => a.grain, + set: (v) => ({ grain: v }), + }, + ], +}; diff --git a/src/utils/photoGps.ts b/src/utils/photoGps.ts index 666eef9..d3dc5f1 100644 --- a/src/utils/photoGps.ts +++ b/src/utils/photoGps.ts @@ -52,16 +52,16 @@ async function resolveFromMediaLibrary( try { perm = await MediaLibrary.requestPermissionsAsync(false, ['photo']); } catch (e) { - console.error('[gps] tier2 MediaLibrary permission request failed: ' + String(e).slice(0, 120)); + console.error('Media library permission request failed (photo GPS): ' + String(e).slice(0, 120)); return { gps: null, permissionDenied: true }; } if (!perm.granted) { - console.error('[gps] tier2 MediaLibrary permission denied'); + console.error('Media library read permission denied (photo GPS)'); return { gps: null, permissionDenied: true }; } const id = pickerAssetId(asset); if (!id) { - console.error('[gps] tier2 no assetId to query MediaStore'); + console.warn('Photo has no media-library asset id — GPS lookup skipped'); return { gps: null, permissionDenied: false }; } try { @@ -69,7 +69,6 @@ async function resolveFromMediaLibrary( if (info.location && Number.isFinite(info.location.latitude) && Number.isFinite(info.location.longitude)) { const { latitude, longitude } = info.location; const locality = useGeotag ? await localityFor(latitude, longitude) : undefined; - console.error(`[gps] tier2 MediaStore location lat=${latitude.toFixed(5)} lon=${longitude.toFixed(5)}`); return { gps: { latitude, @@ -82,9 +81,9 @@ async function resolveFromMediaLibrary( permissionDenied: false, }; } - console.error('[gps] tier2 MediaStore asset has no location (photo may have no GPS, or ACCESS_MEDIA_LOCATION read failed silently)'); + console.warn('Media library photo has no location (no GPS, or ACCESS_MEDIA_LOCATION denied silently)'); } catch (e) { - console.error('[gps] tier2 getAssetInfoAsync failed: ' + String(e).slice(0, 160)); + console.error('Media library asset lookup failed (photo GPS): ' + String(e).slice(0, 160)); } return { gps: null, permissionDenied: false }; } @@ -102,12 +101,11 @@ export async function resolvePhotoGPS( if (exifCoord) { const timestamp = parseExifTimestamp(asset.exif) ?? Date.now(); const locality = useGeotag ? await localityFor(exifCoord.latitude, exifCoord.longitude) : undefined; - console.error(`[gps] tier1 EXIF lat=${exifCoord.latitude.toFixed(5)} lon=${exifCoord.longitude.toFixed(5)}`); return { gps: { ...exifCoord, locality, country: undefined, timestamp, source: 'exif' }, }; } - console.error('[gps] tier1 no EXIF GPS in picker metadata'); + console.warn('No EXIF GPS in picker metadata'); // Tier 2 — MediaLibrary metadata (Android 10+ requires ACCESS_MEDIA_LOCATION) const assetId = pickerAssetId(asset); @@ -116,14 +114,13 @@ export async function resolvePhotoGPS( if (gps) return { gps }; if (permissionDenied) return { gps: null, permissionDenied: true }; } else { - console.error('[gps] tier2 skipped — no asset id/uri'); + console.warn('Photo GPS tier-2 skipped — no asset id/uri'); } // Tier 3 — device fallback (photo has no location; stamp the device's current spot) if (allowDeviceFallback) { const deviceGps = await getCurrentGPS(); if (deviceGps) { - console.error(`[gps] tier3 DEVICE GPS fallback lat=${deviceGps.latitude.toFixed(5)} lon=${deviceGps.longitude.toFixed(5)}`); return { gps: { ...deviceGps, source: 'device' } }; } }