formulab 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +144 -0
- package/LICENSE +21 -0
- package/README.md +403 -0
- package/dist/automotive/batteryRuntime.d.ts +14 -0
- package/dist/automotive/batteryRuntime.d.ts.map +1 -0
- package/dist/automotive/batteryRuntime.js +38 -0
- package/dist/automotive/batteryRuntime.js.map +1 -0
- package/dist/automotive/evCharging.d.ts +14 -0
- package/dist/automotive/evCharging.d.ts.map +1 -0
- package/dist/automotive/evCharging.js +48 -0
- package/dist/automotive/evCharging.js.map +1 -0
- package/dist/automotive/fuelEconomy.d.ts +15 -0
- package/dist/automotive/fuelEconomy.d.ts.map +1 -0
- package/dist/automotive/fuelEconomy.js +61 -0
- package/dist/automotive/fuelEconomy.js.map +1 -0
- package/dist/automotive/gearRatio.d.ts +15 -0
- package/dist/automotive/gearRatio.d.ts.map +1 -0
- package/dist/automotive/gearRatio.js +39 -0
- package/dist/automotive/gearRatio.js.map +1 -0
- package/dist/automotive/index.d.ts +9 -0
- package/dist/automotive/index.d.ts.map +1 -0
- package/dist/automotive/index.js +9 -0
- package/dist/automotive/index.js.map +1 -0
- package/dist/automotive/power.d.ts +14 -0
- package/dist/automotive/power.d.ts.map +1 -0
- package/dist/automotive/power.js +52 -0
- package/dist/automotive/power.js.map +1 -0
- package/dist/automotive/tireCompare.d.ts +9 -0
- package/dist/automotive/tireCompare.d.ts.map +1 -0
- package/dist/automotive/tireCompare.js +54 -0
- package/dist/automotive/tireCompare.js.map +1 -0
- package/dist/automotive/torque.d.ts +14 -0
- package/dist/automotive/torque.d.ts.map +1 -0
- package/dist/automotive/torque.js +52 -0
- package/dist/automotive/torque.js.map +1 -0
- package/dist/automotive/types.d.ts +114 -0
- package/dist/automotive/types.d.ts.map +1 -0
- package/dist/automotive/types.js +2 -0
- package/dist/automotive/types.js.map +1 -0
- package/dist/chemical/batch.d.ts +12 -0
- package/dist/chemical/batch.d.ts.map +1 -0
- package/dist/chemical/batch.js +36 -0
- package/dist/chemical/batch.js.map +1 -0
- package/dist/chemical/concentration.d.ts +15 -0
- package/dist/chemical/concentration.d.ts.map +1 -0
- package/dist/chemical/concentration.js +45 -0
- package/dist/chemical/concentration.js.map +1 -0
- package/dist/chemical/dilution.d.ts +12 -0
- package/dist/chemical/dilution.d.ts.map +1 -0
- package/dist/chemical/dilution.js +68 -0
- package/dist/chemical/dilution.js.map +1 -0
- package/dist/chemical/index.d.ts +9 -0
- package/dist/chemical/index.d.ts.map +1 -0
- package/dist/chemical/index.js +9 -0
- package/dist/chemical/index.js.map +1 -0
- package/dist/chemical/injectionCycle.d.ts +19 -0
- package/dist/chemical/injectionCycle.d.ts.map +1 -0
- package/dist/chemical/injectionCycle.js +170 -0
- package/dist/chemical/injectionCycle.js.map +1 -0
- package/dist/chemical/ph.d.ts +13 -0
- package/dist/chemical/ph.d.ts.map +1 -0
- package/dist/chemical/ph.js +83 -0
- package/dist/chemical/ph.js.map +1 -0
- package/dist/chemical/reactor.d.ts +19 -0
- package/dist/chemical/reactor.d.ts.map +1 -0
- package/dist/chemical/reactor.js +57 -0
- package/dist/chemical/reactor.js.map +1 -0
- package/dist/chemical/shelfLife.d.ts +15 -0
- package/dist/chemical/shelfLife.d.ts.map +1 -0
- package/dist/chemical/shelfLife.js +36 -0
- package/dist/chemical/shelfLife.js.map +1 -0
- package/dist/chemical/types.d.ts +144 -0
- package/dist/chemical/types.d.ts.map +1 -0
- package/dist/chemical/types.js +2 -0
- package/dist/chemical/types.js.map +1 -0
- package/dist/construction/aggregate.d.ts +33 -0
- package/dist/construction/aggregate.d.ts.map +1 -0
- package/dist/construction/aggregate.js +92 -0
- package/dist/construction/aggregate.js.map +1 -0
- package/dist/construction/beamLoad.d.ts +12 -0
- package/dist/construction/beamLoad.d.ts.map +1 -0
- package/dist/construction/beamLoad.js +156 -0
- package/dist/construction/beamLoad.js.map +1 -0
- package/dist/construction/brick.d.ts +17 -0
- package/dist/construction/brick.d.ts.map +1 -0
- package/dist/construction/brick.js +53 -0
- package/dist/construction/brick.js.map +1 -0
- package/dist/construction/concreteMix.d.ts +9 -0
- package/dist/construction/concreteMix.d.ts.map +1 -0
- package/dist/construction/concreteMix.js +31 -0
- package/dist/construction/concreteMix.js.map +1 -0
- package/dist/construction/earthwork.d.ts +13 -0
- package/dist/construction/earthwork.d.ts.map +1 -0
- package/dist/construction/earthwork.js +25 -0
- package/dist/construction/earthwork.js.map +1 -0
- package/dist/construction/formwork.d.ts +9 -0
- package/dist/construction/formwork.d.ts.map +1 -0
- package/dist/construction/formwork.js +61 -0
- package/dist/construction/formwork.js.map +1 -0
- package/dist/construction/index.d.ts +13 -0
- package/dist/construction/index.d.ts.map +1 -0
- package/dist/construction/index.js +13 -0
- package/dist/construction/index.js.map +1 -0
- package/dist/construction/pert.d.ts +15 -0
- package/dist/construction/pert.d.ts.map +1 -0
- package/dist/construction/pert.js +207 -0
- package/dist/construction/pert.js.map +1 -0
- package/dist/construction/rebar.d.ts +16 -0
- package/dist/construction/rebar.d.ts.map +1 -0
- package/dist/construction/rebar.js +43 -0
- package/dist/construction/rebar.js.map +1 -0
- package/dist/construction/roof.d.ts +16 -0
- package/dist/construction/roof.d.ts.map +1 -0
- package/dist/construction/roof.js +65 -0
- package/dist/construction/roof.js.map +1 -0
- package/dist/construction/slope.d.ts +14 -0
- package/dist/construction/slope.d.ts.map +1 -0
- package/dist/construction/slope.js +54 -0
- package/dist/construction/slope.js.map +1 -0
- package/dist/construction/stair.d.ts +17 -0
- package/dist/construction/stair.d.ts.map +1 -0
- package/dist/construction/stair.js +69 -0
- package/dist/construction/stair.js.map +1 -0
- package/dist/construction/types.d.ts +219 -0
- package/dist/construction/types.d.ts.map +1 -0
- package/dist/construction/types.js +2 -0
- package/dist/construction/types.js.map +1 -0
- package/dist/electronics/awg.d.ts +9 -0
- package/dist/electronics/awg.d.ts.map +1 -0
- package/dist/electronics/awg.js +66 -0
- package/dist/electronics/awg.js.map +1 -0
- package/dist/electronics/capacitor.d.ts +9 -0
- package/dist/electronics/capacitor.d.ts.map +1 -0
- package/dist/electronics/capacitor.js +51 -0
- package/dist/electronics/capacitor.js.map +1 -0
- package/dist/electronics/index.d.ts +12 -0
- package/dist/electronics/index.d.ts.map +1 -0
- package/dist/electronics/index.js +12 -0
- package/dist/electronics/index.js.map +1 -0
- package/dist/electronics/led.d.ts +9 -0
- package/dist/electronics/led.d.ts.map +1 -0
- package/dist/electronics/led.js +72 -0
- package/dist/electronics/led.js.map +1 -0
- package/dist/electronics/reflow.d.ts +12 -0
- package/dist/electronics/reflow.d.ts.map +1 -0
- package/dist/electronics/reflow.js +77 -0
- package/dist/electronics/reflow.js.map +1 -0
- package/dist/electronics/resistor.d.ts +8 -0
- package/dist/electronics/resistor.d.ts.map +1 -0
- package/dist/electronics/resistor.js +137 -0
- package/dist/electronics/resistor.js.map +1 -0
- package/dist/electronics/smt-takt.d.ts +8 -0
- package/dist/electronics/smt-takt.d.ts.map +1 -0
- package/dist/electronics/smt-takt.js +59 -0
- package/dist/electronics/smt-takt.js.map +1 -0
- package/dist/electronics/solder.d.ts +8 -0
- package/dist/electronics/solder.d.ts.map +1 -0
- package/dist/electronics/solder.js +46 -0
- package/dist/electronics/solder.js.map +1 -0
- package/dist/electronics/stencil.d.ts +9 -0
- package/dist/electronics/stencil.d.ts.map +1 -0
- package/dist/electronics/stencil.js +78 -0
- package/dist/electronics/stencil.js.map +1 -0
- package/dist/electronics/trace.d.ts +8 -0
- package/dist/electronics/trace.d.ts.map +1 -0
- package/dist/electronics/trace.js +75 -0
- package/dist/electronics/trace.js.map +1 -0
- package/dist/electronics/types.d.ts +145 -0
- package/dist/electronics/types.d.ts.map +1 -0
- package/dist/electronics/types.js +2 -0
- package/dist/electronics/types.js.map +1 -0
- package/dist/electronics/via.d.ts +12 -0
- package/dist/electronics/via.d.ts.map +1 -0
- package/dist/electronics/via.js +63 -0
- package/dist/electronics/via.js.map +1 -0
- package/dist/energy/carbonFootprint.d.ts +13 -0
- package/dist/energy/carbonFootprint.d.ts.map +1 -0
- package/dist/energy/carbonFootprint.js +41 -0
- package/dist/energy/carbonFootprint.js.map +1 -0
- package/dist/energy/compressedAirCost.d.ts +14 -0
- package/dist/energy/compressedAirCost.d.ts.map +1 -0
- package/dist/energy/compressedAirCost.js +39 -0
- package/dist/energy/compressedAirCost.js.map +1 -0
- package/dist/energy/index.d.ts +8 -0
- package/dist/energy/index.d.ts.map +1 -0
- package/dist/energy/index.js +8 -0
- package/dist/energy/index.js.map +1 -0
- package/dist/energy/motorEfficiency.d.ts +14 -0
- package/dist/energy/motorEfficiency.d.ts.map +1 -0
- package/dist/energy/motorEfficiency.js +47 -0
- package/dist/energy/motorEfficiency.js.map +1 -0
- package/dist/energy/pfCorrection.d.ts +15 -0
- package/dist/energy/pfCorrection.d.ts.map +1 -0
- package/dist/energy/pfCorrection.js +56 -0
- package/dist/energy/pfCorrection.js.map +1 -0
- package/dist/energy/powerCost.d.ts +15 -0
- package/dist/energy/powerCost.d.ts.map +1 -0
- package/dist/energy/powerCost.js +37 -0
- package/dist/energy/powerCost.js.map +1 -0
- package/dist/energy/types.d.ts +119 -0
- package/dist/energy/types.d.ts.map +1 -0
- package/dist/energy/types.js +2 -0
- package/dist/energy/types.js.map +1 -0
- package/dist/energy/vfdSavings.d.ts +16 -0
- package/dist/energy/vfdSavings.d.ts.map +1 -0
- package/dist/energy/vfdSavings.js +57 -0
- package/dist/energy/vfdSavings.js.map +1 -0
- package/dist/food/calorie.d.ts +13 -0
- package/dist/food/calorie.d.ts.map +1 -0
- package/dist/food/calorie.js +42 -0
- package/dist/food/calorie.js.map +1 -0
- package/dist/food/expiry.d.ts +13 -0
- package/dist/food/expiry.d.ts.map +1 -0
- package/dist/food/expiry.js +58 -0
- package/dist/food/expiry.js.map +1 -0
- package/dist/food/haccp.d.ts +18 -0
- package/dist/food/haccp.d.ts.map +1 -0
- package/dist/food/haccp.js +70 -0
- package/dist/food/haccp.js.map +1 -0
- package/dist/food/index.d.ts +6 -0
- package/dist/food/index.d.ts.map +1 -0
- package/dist/food/index.js +6 -0
- package/dist/food/index.js.map +1 -0
- package/dist/food/nutrition.d.ts +12 -0
- package/dist/food/nutrition.d.ts.map +1 -0
- package/dist/food/nutrition.js +75 -0
- package/dist/food/nutrition.js.map +1 -0
- package/dist/food/types.d.ts +104 -0
- package/dist/food/types.d.ts.map +1 -0
- package/dist/food/types.js +2 -0
- package/dist/food/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/logistics/cbm.d.ts +12 -0
- package/dist/logistics/cbm.d.ts.map +1 -0
- package/dist/logistics/cbm.js +37 -0
- package/dist/logistics/cbm.js.map +1 -0
- package/dist/logistics/containerFit.d.ts +12 -0
- package/dist/logistics/containerFit.d.ts.map +1 -0
- package/dist/logistics/containerFit.js +73 -0
- package/dist/logistics/containerFit.js.map +1 -0
- package/dist/logistics/dimWeight.d.ts +13 -0
- package/dist/logistics/dimWeight.d.ts.map +1 -0
- package/dist/logistics/dimWeight.js +50 -0
- package/dist/logistics/dimWeight.js.map +1 -0
- package/dist/logistics/eoq.d.ts +18 -0
- package/dist/logistics/eoq.d.ts.map +1 -0
- package/dist/logistics/eoq.js +42 -0
- package/dist/logistics/eoq.js.map +1 -0
- package/dist/logistics/fillRate.d.ts +22 -0
- package/dist/logistics/fillRate.d.ts.map +1 -0
- package/dist/logistics/fillRate.js +84 -0
- package/dist/logistics/fillRate.js.map +1 -0
- package/dist/logistics/freightClass.d.ts +12 -0
- package/dist/logistics/freightClass.d.ts.map +1 -0
- package/dist/logistics/freightClass.js +68 -0
- package/dist/logistics/freightClass.js.map +1 -0
- package/dist/logistics/index.d.ts +15 -0
- package/dist/logistics/index.d.ts.map +1 -0
- package/dist/logistics/index.js +15 -0
- package/dist/logistics/index.js.map +1 -0
- package/dist/logistics/kanban.d.ts +19 -0
- package/dist/logistics/kanban.d.ts.map +1 -0
- package/dist/logistics/kanban.js +48 -0
- package/dist/logistics/kanban.js.map +1 -0
- package/dist/logistics/pallet3d.d.ts +16 -0
- package/dist/logistics/pallet3d.d.ts.map +1 -0
- package/dist/logistics/pallet3d.js +380 -0
- package/dist/logistics/pallet3d.js.map +1 -0
- package/dist/logistics/palletStack.d.ts +12 -0
- package/dist/logistics/palletStack.d.ts.map +1 -0
- package/dist/logistics/palletStack.js +65 -0
- package/dist/logistics/palletStack.js.map +1 -0
- package/dist/logistics/pickTime.d.ts +17 -0
- package/dist/logistics/pickTime.d.ts.map +1 -0
- package/dist/logistics/pickTime.js +70 -0
- package/dist/logistics/pickTime.js.map +1 -0
- package/dist/logistics/safetyStock.d.ts +24 -0
- package/dist/logistics/safetyStock.d.ts.map +1 -0
- package/dist/logistics/safetyStock.js +99 -0
- package/dist/logistics/safetyStock.js.map +1 -0
- package/dist/logistics/shipping.d.ts +16 -0
- package/dist/logistics/shipping.d.ts.map +1 -0
- package/dist/logistics/shipping.js +115 -0
- package/dist/logistics/shipping.js.map +1 -0
- package/dist/logistics/tsp.d.ts +12 -0
- package/dist/logistics/tsp.d.ts.map +1 -0
- package/dist/logistics/tsp.js +166 -0
- package/dist/logistics/tsp.js.map +1 -0
- package/dist/logistics/types.d.ts +315 -0
- package/dist/logistics/types.d.ts.map +1 -0
- package/dist/logistics/types.js +5 -0
- package/dist/logistics/types.js.map +1 -0
- package/dist/metal/bearing.d.ts +11 -0
- package/dist/metal/bearing.d.ts.map +1 -0
- package/dist/metal/bearing.js +32 -0
- package/dist/metal/bearing.js.map +1 -0
- package/dist/metal/bendAllowance.d.ts +13 -0
- package/dist/metal/bendAllowance.d.ts.map +1 -0
- package/dist/metal/bendAllowance.js +75 -0
- package/dist/metal/bendAllowance.js.map +1 -0
- package/dist/metal/bolt.d.ts +32 -0
- package/dist/metal/bolt.d.ts.map +1 -0
- package/dist/metal/bolt.js +149 -0
- package/dist/metal/bolt.js.map +1 -0
- package/dist/metal/cutting.d.ts +10 -0
- package/dist/metal/cutting.d.ts.map +1 -0
- package/dist/metal/cutting.js +55 -0
- package/dist/metal/cutting.js.map +1 -0
- package/dist/metal/cuttingStock.d.ts +8 -0
- package/dist/metal/cuttingStock.d.ts.map +1 -0
- package/dist/metal/cuttingStock.js +89 -0
- package/dist/metal/cuttingStock.js.map +1 -0
- package/dist/metal/flatPattern.d.ts +12 -0
- package/dist/metal/flatPattern.d.ts.map +1 -0
- package/dist/metal/flatPattern.js +50 -0
- package/dist/metal/flatPattern.js.map +1 -0
- package/dist/metal/gear.d.ts +13 -0
- package/dist/metal/gear.d.ts.map +1 -0
- package/dist/metal/gear.js +79 -0
- package/dist/metal/gear.js.map +1 -0
- package/dist/metal/hardness.d.ts +15 -0
- package/dist/metal/hardness.d.ts.map +1 -0
- package/dist/metal/hardness.js +77 -0
- package/dist/metal/hardness.js.map +1 -0
- package/dist/metal/index.d.ts +24 -0
- package/dist/metal/index.d.ts.map +1 -0
- package/dist/metal/index.js +24 -0
- package/dist/metal/index.js.map +1 -0
- package/dist/metal/kFactorReverse.d.ts +19 -0
- package/dist/metal/kFactorReverse.d.ts.map +1 -0
- package/dist/metal/kFactorReverse.js +39 -0
- package/dist/metal/kFactorReverse.js.map +1 -0
- package/dist/metal/material.d.ts +5 -0
- package/dist/metal/material.d.ts.map +1 -0
- package/dist/metal/material.js +56 -0
- package/dist/metal/material.js.map +1 -0
- package/dist/metal/metalWeight.d.ts +10 -0
- package/dist/metal/metalWeight.d.ts.map +1 -0
- package/dist/metal/metalWeight.js +82 -0
- package/dist/metal/metalWeight.js.map +1 -0
- package/dist/metal/pressFit.d.ts +15 -0
- package/dist/metal/pressFit.d.ts.map +1 -0
- package/dist/metal/pressFit.js +96 -0
- package/dist/metal/pressFit.js.map +1 -0
- package/dist/metal/pressTonnage.d.ts +13 -0
- package/dist/metal/pressTonnage.d.ts.map +1 -0
- package/dist/metal/pressTonnage.js +86 -0
- package/dist/metal/pressTonnage.js.map +1 -0
- package/dist/metal/roughness.d.ts +6 -0
- package/dist/metal/roughness.d.ts.map +1 -0
- package/dist/metal/roughness.js +62 -0
- package/dist/metal/roughness.js.map +1 -0
- package/dist/metal/screw.d.ts +7 -0
- package/dist/metal/screw.d.ts.map +1 -0
- package/dist/metal/screw.js +44 -0
- package/dist/metal/screw.js.map +1 -0
- package/dist/metal/spring.d.ts +11 -0
- package/dist/metal/spring.d.ts.map +1 -0
- package/dist/metal/spring.js +59 -0
- package/dist/metal/spring.js.map +1 -0
- package/dist/metal/tap.d.ts +16 -0
- package/dist/metal/tap.d.ts.map +1 -0
- package/dist/metal/tap.js +62 -0
- package/dist/metal/tap.js.map +1 -0
- package/dist/metal/thread.d.ts +8 -0
- package/dist/metal/thread.d.ts.map +1 -0
- package/dist/metal/thread.js +75 -0
- package/dist/metal/thread.js.map +1 -0
- package/dist/metal/tolerance.d.ts +6 -0
- package/dist/metal/tolerance.d.ts.map +1 -0
- package/dist/metal/tolerance.js +113 -0
- package/dist/metal/tolerance.js.map +1 -0
- package/dist/metal/types.d.ts +494 -0
- package/dist/metal/types.d.ts.map +1 -0
- package/dist/metal/types.js +2 -0
- package/dist/metal/types.js.map +1 -0
- package/dist/metal/vibration.d.ts +6 -0
- package/dist/metal/vibration.d.ts.map +1 -0
- package/dist/metal/vibration.js +153 -0
- package/dist/metal/vibration.js.map +1 -0
- package/dist/metal/weldHeat.d.ts +6 -0
- package/dist/metal/weldHeat.d.ts.map +1 -0
- package/dist/metal/weldHeat.js +138 -0
- package/dist/metal/weldHeat.js.map +1 -0
- package/dist/metal/welding.d.ts +6 -0
- package/dist/metal/welding.d.ts.map +1 -0
- package/dist/metal/welding.js +80 -0
- package/dist/metal/welding.js.map +1 -0
- package/dist/quality/aql.d.ts +10 -0
- package/dist/quality/aql.d.ts.map +1 -0
- package/dist/quality/aql.js +104 -0
- package/dist/quality/aql.js.map +1 -0
- package/dist/quality/cpk.d.ts +14 -0
- package/dist/quality/cpk.d.ts.map +1 -0
- package/dist/quality/cpk.js +44 -0
- package/dist/quality/cpk.js.map +1 -0
- package/dist/quality/cycle.d.ts +11 -0
- package/dist/quality/cycle.d.ts.map +1 -0
- package/dist/quality/cycle.js +55 -0
- package/dist/quality/cycle.js.map +1 -0
- package/dist/quality/downtime.d.ts +9 -0
- package/dist/quality/downtime.d.ts.map +1 -0
- package/dist/quality/downtime.js +28 -0
- package/dist/quality/downtime.js.map +1 -0
- package/dist/quality/dpmo.d.ts +10 -0
- package/dist/quality/dpmo.d.ts.map +1 -0
- package/dist/quality/dpmo.js +114 -0
- package/dist/quality/dpmo.js.map +1 -0
- package/dist/quality/index.d.ts +15 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +15 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/lineBalancing.d.ts +9 -0
- package/dist/quality/lineBalancing.d.ts.map +1 -0
- package/dist/quality/lineBalancing.js +185 -0
- package/dist/quality/lineBalancing.js.map +1 -0
- package/dist/quality/mtbf.d.ts +13 -0
- package/dist/quality/mtbf.d.ts.map +1 -0
- package/dist/quality/mtbf.js +48 -0
- package/dist/quality/mtbf.js.map +1 -0
- package/dist/quality/oee.d.ts +11 -0
- package/dist/quality/oee.d.ts.map +1 -0
- package/dist/quality/oee.js +43 -0
- package/dist/quality/oee.js.map +1 -0
- package/dist/quality/ppk.d.ts +15 -0
- package/dist/quality/ppk.d.ts.map +1 -0
- package/dist/quality/ppk.js +61 -0
- package/dist/quality/ppk.js.map +1 -0
- package/dist/quality/ppm.d.ts +9 -0
- package/dist/quality/ppm.d.ts.map +1 -0
- package/dist/quality/ppm.js +134 -0
- package/dist/quality/ppm.js.map +1 -0
- package/dist/quality/rpn.d.ts +11 -0
- package/dist/quality/rpn.d.ts.map +1 -0
- package/dist/quality/rpn.js +48 -0
- package/dist/quality/rpn.js.map +1 -0
- package/dist/quality/takt.d.ts +13 -0
- package/dist/quality/takt.d.ts.map +1 -0
- package/dist/quality/takt.js +44 -0
- package/dist/quality/takt.js.map +1 -0
- package/dist/quality/types.d.ts +261 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +2 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/quality/yield.d.ts +12 -0
- package/dist/quality/yield.d.ts.map +1 -0
- package/dist/quality/yield.js +56 -0
- package/dist/quality/yield.js.map +1 -0
- package/dist/safety/fallClearance.d.ts +12 -0
- package/dist/safety/fallClearance.d.ts.map +1 -0
- package/dist/safety/fallClearance.js +37 -0
- package/dist/safety/fallClearance.js.map +1 -0
- package/dist/safety/havsCalculate.d.ts +16 -0
- package/dist/safety/havsCalculate.d.ts.map +1 -0
- package/dist/safety/havsCalculate.js +103 -0
- package/dist/safety/havsCalculate.js.map +1 -0
- package/dist/safety/index.d.ts +8 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +8 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/nioshLifting.d.ts +21 -0
- package/dist/safety/nioshLifting.d.ts.map +1 -0
- package/dist/safety/nioshLifting.js +164 -0
- package/dist/safety/nioshLifting.js.map +1 -0
- package/dist/safety/noiseExposure.d.ts +22 -0
- package/dist/safety/noiseExposure.d.ts.map +1 -0
- package/dist/safety/noiseExposure.js +76 -0
- package/dist/safety/noiseExposure.js.map +1 -0
- package/dist/safety/respiratorCalculate.d.ts +14 -0
- package/dist/safety/respiratorCalculate.d.ts.map +1 -0
- package/dist/safety/respiratorCalculate.js +90 -0
- package/dist/safety/respiratorCalculate.js.map +1 -0
- package/dist/safety/types.d.ts +93 -0
- package/dist/safety/types.d.ts.map +1 -0
- package/dist/safety/types.js +2 -0
- package/dist/safety/types.js.map +1 -0
- package/dist/safety/wbgtCalculate.d.ts +25 -0
- package/dist/safety/wbgtCalculate.d.ts.map +1 -0
- package/dist/safety/wbgtCalculate.js +65 -0
- package/dist/safety/wbgtCalculate.js.map +1 -0
- package/dist/utility/assignment.d.ts +11 -0
- package/dist/utility/assignment.d.ts.map +1 -0
- package/dist/utility/assignment.js +113 -0
- package/dist/utility/assignment.js.map +1 -0
- package/dist/utility/index.d.ts +4 -0
- package/dist/utility/index.d.ts.map +1 -0
- package/dist/utility/index.js +4 -0
- package/dist/utility/index.js.map +1 -0
- package/dist/utility/qrcode.d.ts +30 -0
- package/dist/utility/qrcode.d.ts.map +1 -0
- package/dist/utility/qrcode.js +30 -0
- package/dist/utility/qrcode.js.map +1 -0
- package/dist/utility/types.d.ts +64 -0
- package/dist/utility/types.d.ts.map +1 -0
- package/dist/utility/types.js +2 -0
- package/dist/utility/types.js.map +1 -0
- package/dist/utility/unit.d.ts +25 -0
- package/dist/utility/unit.d.ts.map +1 -0
- package/dist/utility/unit.js +136 -0
- package/dist/utility/unit.js.map +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PickTimeInput, PickTimeResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate warehouse pick time per order
|
|
4
|
+
*
|
|
5
|
+
* Pick time is a key metric for warehouse productivity. It includes:
|
|
6
|
+
* - Travel time: walking between pick locations
|
|
7
|
+
* - Search time: locating items at the pick face
|
|
8
|
+
* - Pick time: physically retrieving items
|
|
9
|
+
* - Documentation time: scanning, confirming, paperwork
|
|
10
|
+
*
|
|
11
|
+
* Batch picking can reduce travel time by combining multiple orders.
|
|
12
|
+
*
|
|
13
|
+
* @param input - Pick time parameters
|
|
14
|
+
* @returns Pick time breakdown and productivity metrics
|
|
15
|
+
*/
|
|
16
|
+
export declare function pickTime(input: PickTimeInput): PickTimeResult;
|
|
17
|
+
//# sourceMappingURL=pickTime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickTime.d.ts","sourceRoot":"","sources":["../../src/logistics/pickTime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAqE7D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate warehouse pick time per order
|
|
4
|
+
*
|
|
5
|
+
* Pick time is a key metric for warehouse productivity. It includes:
|
|
6
|
+
* - Travel time: walking between pick locations
|
|
7
|
+
* - Search time: locating items at the pick face
|
|
8
|
+
* - Pick time: physically retrieving items
|
|
9
|
+
* - Documentation time: scanning, confirming, paperwork
|
|
10
|
+
*
|
|
11
|
+
* Batch picking can reduce travel time by combining multiple orders.
|
|
12
|
+
*
|
|
13
|
+
* @param input - Pick time parameters
|
|
14
|
+
* @returns Pick time breakdown and productivity metrics
|
|
15
|
+
*/
|
|
16
|
+
export function pickTime(input) {
|
|
17
|
+
const { mode, distance, speed, itemsPerOrder, searchTimePerItem, pickTimePerItem, documentationTime, batchSize = 1, } = input;
|
|
18
|
+
// Handle zero/invalid inputs
|
|
19
|
+
if (speed <= 0 || itemsPerOrder <= 0) {
|
|
20
|
+
return {
|
|
21
|
+
travelTime: 0,
|
|
22
|
+
searchTime: 0,
|
|
23
|
+
pickTime: 0,
|
|
24
|
+
documentationTime: 0,
|
|
25
|
+
totalTime: 0,
|
|
26
|
+
totalTimeMinutes: 0,
|
|
27
|
+
ordersPerHour: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Calculate base times
|
|
31
|
+
// Travel time = distance / speed, convert to seconds (speed is per minute)
|
|
32
|
+
const baseTravelTime = (distance / speed) * 60;
|
|
33
|
+
// Search and pick times scale with items
|
|
34
|
+
const baseSearchTime = itemsPerOrder * searchTimePerItem;
|
|
35
|
+
const basePickTime = itemsPerOrder * pickTimePerItem;
|
|
36
|
+
let travelTime;
|
|
37
|
+
let searchTime;
|
|
38
|
+
let pick;
|
|
39
|
+
let docTime;
|
|
40
|
+
if (mode === 'batch' && batchSize > 1) {
|
|
41
|
+
// Batch picking: share travel time across orders in batch
|
|
42
|
+
// Assume travel time is shared but search/pick is per order
|
|
43
|
+
// Documentation is per order
|
|
44
|
+
travelTime = baseTravelTime / batchSize;
|
|
45
|
+
searchTime = baseSearchTime; // Per order
|
|
46
|
+
pick = basePickTime; // Per order
|
|
47
|
+
docTime = documentationTime; // Per order
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Single order picking
|
|
51
|
+
travelTime = baseTravelTime;
|
|
52
|
+
searchTime = baseSearchTime;
|
|
53
|
+
pick = basePickTime;
|
|
54
|
+
docTime = documentationTime;
|
|
55
|
+
}
|
|
56
|
+
const totalTime = travelTime + searchTime + pick + docTime;
|
|
57
|
+
const totalTimeMinutes = totalTime / 60;
|
|
58
|
+
// Orders per hour calculation
|
|
59
|
+
const ordersPerHour = totalTime > 0 ? 3600 / totalTime : 0;
|
|
60
|
+
return {
|
|
61
|
+
travelTime: roundTo(travelTime, 1),
|
|
62
|
+
searchTime: roundTo(searchTime, 1),
|
|
63
|
+
pickTime: roundTo(pick, 1),
|
|
64
|
+
documentationTime: roundTo(docTime, 1),
|
|
65
|
+
totalTime: roundTo(totalTime, 1),
|
|
66
|
+
totalTimeMinutes: roundTo(totalTimeMinutes, 2),
|
|
67
|
+
ordersPerHour: roundTo(ordersPerHour, 1),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pickTime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickTime.js","sourceRoot":"","sources":["../../src/logistics/pickTime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,SAAS,GAAG,CAAC,GACd,GAAG,KAAK,CAAC;IAEV,6BAA6B;IAC7B,IAAI,KAAK,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,iBAAiB,EAAE,CAAC;YACpB,SAAS,EAAE,CAAC;YACZ,gBAAgB,EAAE,CAAC;YACnB,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,2EAA2E;IAC3E,MAAM,cAAc,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE/C,yCAAyC;IACzC,MAAM,cAAc,GAAG,aAAa,GAAG,iBAAiB,CAAC;IACzD,MAAM,YAAY,GAAG,aAAa,GAAG,eAAe,CAAC;IAErD,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IACvB,IAAI,IAAY,CAAC;IACjB,IAAI,OAAe,CAAC;IAEpB,IAAI,IAAI,KAAK,OAAO,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACtC,0DAA0D;QAC1D,4DAA4D;QAC5D,6BAA6B;QAC7B,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;QACxC,UAAU,GAAG,cAAc,CAAC,CAAC,YAAY;QACzC,IAAI,GAAG,YAAY,CAAC,CAAC,YAAY;QACjC,OAAO,GAAG,iBAAiB,CAAC,CAAC,YAAY;IAC3C,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,UAAU,GAAG,cAAc,CAAC;QAC5B,UAAU,GAAG,cAAc,CAAC;QAC5B,IAAI,GAAG,YAAY,CAAC;QACpB,OAAO,GAAG,iBAAiB,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC;IAC3D,MAAM,gBAAgB,GAAG,SAAS,GAAG,EAAE,CAAC;IAExC,8BAA8B;IAC9B,MAAM,aAAa,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9C,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SafetyStockInput, SafetyStockResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate Safety Stock and Reorder Point
|
|
4
|
+
*
|
|
5
|
+
* Safety Stock provides a buffer against variability in demand and lead time.
|
|
6
|
+
*
|
|
7
|
+
* Formula:
|
|
8
|
+
* σ_DDLT = sqrt(L × σ_d² + d² × σ_L²)
|
|
9
|
+
* Safety Stock = z × σ_DDLT
|
|
10
|
+
* ROP = (d × L) + Safety Stock
|
|
11
|
+
*
|
|
12
|
+
* Where:
|
|
13
|
+
* d = average daily demand
|
|
14
|
+
* σ_d = standard deviation of daily demand
|
|
15
|
+
* L = average lead time (days)
|
|
16
|
+
* σ_L = standard deviation of lead time
|
|
17
|
+
* z = z-score for desired service level
|
|
18
|
+
* σ_DDLT = standard deviation of demand during lead time
|
|
19
|
+
*
|
|
20
|
+
* @param input - Demand and lead time parameters with service level
|
|
21
|
+
* @returns Safety stock, reorder point, and related metrics
|
|
22
|
+
*/
|
|
23
|
+
export declare function safetyStock(input: SafetyStockInput): SafetyStockResult;
|
|
24
|
+
//# sourceMappingURL=safetyStock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safetyStock.d.ts","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6DtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA2BtE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Approximate inverse of the standard normal CDF (quantile function)
|
|
4
|
+
* Using Abramowitz & Stegun 26.2.23 rational approximation
|
|
5
|
+
*
|
|
6
|
+
* @param p - Probability (0 < p < 1)
|
|
7
|
+
* @returns z-score (standard normal quantile)
|
|
8
|
+
*/
|
|
9
|
+
function normSInv(p) {
|
|
10
|
+
// Coefficients for the rational approximation
|
|
11
|
+
const a1 = -3.969683028665376e+01;
|
|
12
|
+
const a2 = 2.209460984245205e+02;
|
|
13
|
+
const a3 = -2.759285104469687e+02;
|
|
14
|
+
const a4 = 1.383577518672690e+02;
|
|
15
|
+
const a5 = -3.066479806614716e+01;
|
|
16
|
+
const a6 = 2.506628277459239e+00;
|
|
17
|
+
const b1 = -5.447609879822406e+01;
|
|
18
|
+
const b2 = 1.615858368580409e+02;
|
|
19
|
+
const b3 = -1.556989798598866e+02;
|
|
20
|
+
const b4 = 6.680131188771972e+01;
|
|
21
|
+
const b5 = -1.328068155288572e+01;
|
|
22
|
+
const c1 = -7.784894002430293e-03;
|
|
23
|
+
const c2 = -3.223964580411365e-01;
|
|
24
|
+
const c3 = -2.400758277161838e+00;
|
|
25
|
+
const c4 = -2.549732539343734e+00;
|
|
26
|
+
const c5 = 4.374664141464968e+00;
|
|
27
|
+
const c6 = 2.938163982698783e+00;
|
|
28
|
+
const d1 = 7.784695709041462e-03;
|
|
29
|
+
const d2 = 3.224671290700398e-01;
|
|
30
|
+
const d3 = 2.445134137142996e+00;
|
|
31
|
+
const d4 = 3.754408661907416e+00;
|
|
32
|
+
// Define break-points
|
|
33
|
+
const pLow = 0.02425;
|
|
34
|
+
const pHigh = 1 - pLow;
|
|
35
|
+
let q, r;
|
|
36
|
+
if (p < pLow) {
|
|
37
|
+
// Rational approximation for lower region
|
|
38
|
+
q = Math.sqrt(-2 * Math.log(p));
|
|
39
|
+
return (((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) /
|
|
40
|
+
((((d1 * q + d2) * q + d3) * q + d4) * q + 1);
|
|
41
|
+
}
|
|
42
|
+
else if (p <= pHigh) {
|
|
43
|
+
// Rational approximation for central region
|
|
44
|
+
q = p - 0.5;
|
|
45
|
+
r = q * q;
|
|
46
|
+
return (((((a1 * r + a2) * r + a3) * r + a4) * r + a5) * r + a6) * q /
|
|
47
|
+
(((((b1 * r + b2) * r + b3) * r + b4) * r + b5) * r + 1);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Rational approximation for upper region
|
|
51
|
+
q = Math.sqrt(-2 * Math.log(1 - p));
|
|
52
|
+
return -(((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) /
|
|
53
|
+
((((d1 * q + d2) * q + d3) * q + d4) * q + 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Calculate Safety Stock and Reorder Point
|
|
58
|
+
*
|
|
59
|
+
* Safety Stock provides a buffer against variability in demand and lead time.
|
|
60
|
+
*
|
|
61
|
+
* Formula:
|
|
62
|
+
* σ_DDLT = sqrt(L × σ_d² + d² × σ_L²)
|
|
63
|
+
* Safety Stock = z × σ_DDLT
|
|
64
|
+
* ROP = (d × L) + Safety Stock
|
|
65
|
+
*
|
|
66
|
+
* Where:
|
|
67
|
+
* d = average daily demand
|
|
68
|
+
* σ_d = standard deviation of daily demand
|
|
69
|
+
* L = average lead time (days)
|
|
70
|
+
* σ_L = standard deviation of lead time
|
|
71
|
+
* z = z-score for desired service level
|
|
72
|
+
* σ_DDLT = standard deviation of demand during lead time
|
|
73
|
+
*
|
|
74
|
+
* @param input - Demand and lead time parameters with service level
|
|
75
|
+
* @returns Safety stock, reorder point, and related metrics
|
|
76
|
+
*/
|
|
77
|
+
export function safetyStock(input) {
|
|
78
|
+
const { avgDemand, demandStdDev, avgLeadTime, leadTimeStdDev, serviceLevel } = input;
|
|
79
|
+
// Calculate z-score for the desired service level
|
|
80
|
+
const zScore = normSInv(serviceLevel);
|
|
81
|
+
// Average demand during lead time
|
|
82
|
+
const demandDuringLeadTime = avgDemand * avgLeadTime;
|
|
83
|
+
// Standard deviation of demand during lead time (DDLT)
|
|
84
|
+
// σ_DDLT = sqrt(L × σ_d² + d² × σ_L²)
|
|
85
|
+
const varianceDemand = avgLeadTime * (demandStdDev ** 2);
|
|
86
|
+
const varianceLeadTime = (avgDemand ** 2) * (leadTimeStdDev ** 2);
|
|
87
|
+
const stdDevDDLT = Math.sqrt(varianceDemand + varianceLeadTime);
|
|
88
|
+
// Safety Stock = z × σ_DDLT
|
|
89
|
+
const safetyStockValue = zScore * stdDevDDLT;
|
|
90
|
+
// Reorder Point = Average DDLT + Safety Stock
|
|
91
|
+
const reorderPoint = demandDuringLeadTime + safetyStockValue;
|
|
92
|
+
return {
|
|
93
|
+
zScore: roundTo(zScore, 6),
|
|
94
|
+
safetyStock: roundTo(safetyStockValue, 0),
|
|
95
|
+
reorderPoint: roundTo(reorderPoint, 0),
|
|
96
|
+
demandDuringLeadTime: roundTo(demandDuringLeadTime, 0),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=safetyStock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safetyStock.js","sourceRoot":"","sources":["../../src/logistics/safetyStock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ShippingInput, ShippingResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate shipping cost estimate for different modes
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple shipping modes:
|
|
6
|
+
* - Ocean FCL (Full Container Load): Fixed container rate
|
|
7
|
+
* - Ocean LCL (Less than Container Load): Per CBM or weight
|
|
8
|
+
* - Air Freight: Volumetric weight factor
|
|
9
|
+
* - Express Courier: Premium volumetric rates
|
|
10
|
+
* - Truck: Distance + weight based
|
|
11
|
+
*
|
|
12
|
+
* @param input - Shipment details
|
|
13
|
+
* @returns Cost estimate or null if invalid input
|
|
14
|
+
*/
|
|
15
|
+
export declare function shipping(input: ShippingInput): ShippingResult | null;
|
|
16
|
+
//# sourceMappingURL=shipping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipping.d.ts","sourceRoot":"","sources":["../../src/logistics/shipping.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAsGpE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate shipping cost estimate for different modes
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple shipping modes:
|
|
6
|
+
* - Ocean FCL (Full Container Load): Fixed container rate
|
|
7
|
+
* - Ocean LCL (Less than Container Load): Per CBM or weight
|
|
8
|
+
* - Air Freight: Volumetric weight factor
|
|
9
|
+
* - Express Courier: Premium volumetric rates
|
|
10
|
+
* - Truck: Distance + weight based
|
|
11
|
+
*
|
|
12
|
+
* @param input - Shipment details
|
|
13
|
+
* @returns Cost estimate or null if invalid input
|
|
14
|
+
*/
|
|
15
|
+
export function shipping(input) {
|
|
16
|
+
const { mode, weight, volume, distance } = input;
|
|
17
|
+
if (weight <= 0 || volume <= 0)
|
|
18
|
+
return null;
|
|
19
|
+
let volumetricWeight;
|
|
20
|
+
let estimatedCost;
|
|
21
|
+
let transitDays;
|
|
22
|
+
let notes;
|
|
23
|
+
switch (mode) {
|
|
24
|
+
case 'ocean_fcl': {
|
|
25
|
+
volumetricWeight = roundTo((volume * 1000) / 6, 2);
|
|
26
|
+
const base = 1500;
|
|
27
|
+
const extra = weight > 10000 ? (weight - 10000) * 0.5 : 0;
|
|
28
|
+
estimatedCost = roundTo(base + extra, 2);
|
|
29
|
+
transitDays = '20-40 days';
|
|
30
|
+
notes = 'Based on 20ft container. For 40ft, approximately double the base rate.';
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case 'ocean_lcl': {
|
|
34
|
+
volumetricWeight = roundTo((volume * 1000) / 6, 2);
|
|
35
|
+
const byCbm = volume * 50;
|
|
36
|
+
const byWeight = weight * 0.15;
|
|
37
|
+
estimatedCost = roundTo(Math.max(byCbm, byWeight, 100), 2);
|
|
38
|
+
transitDays = '25-45 days';
|
|
39
|
+
notes = 'Charged per CBM or per kg, whichever is higher. Minimum charge $100.';
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'air': {
|
|
43
|
+
volumetricWeight = roundTo(volume * 167, 2);
|
|
44
|
+
const chargeableWt = Math.max(weight, volumetricWeight);
|
|
45
|
+
estimatedCost = roundTo(chargeableWt * 3.5, 2);
|
|
46
|
+
transitDays = '3-7 days';
|
|
47
|
+
notes = 'Volumetric factor: 1 CBM = 167 kg. Rate: $3.50/kg chargeable weight.';
|
|
48
|
+
const result = {
|
|
49
|
+
mode: 'Air Freight',
|
|
50
|
+
chargeableWeight: roundTo(chargeableWt, 2),
|
|
51
|
+
volumetricWeight,
|
|
52
|
+
estimatedCost,
|
|
53
|
+
costPerKg: roundTo(estimatedCost / chargeableWt, 2),
|
|
54
|
+
transitDays,
|
|
55
|
+
notes,
|
|
56
|
+
};
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
case 'express': {
|
|
60
|
+
volumetricWeight = roundTo(volume * 200, 2);
|
|
61
|
+
const chargeableWt = Math.max(weight, volumetricWeight);
|
|
62
|
+
estimatedCost = roundTo(Math.max(chargeableWt * 8, 50), 2);
|
|
63
|
+
transitDays = '2-5 days';
|
|
64
|
+
notes = 'Volumetric factor: 1 CBM = 200 kg. Rate: $8/kg. Minimum charge $50.';
|
|
65
|
+
const result = {
|
|
66
|
+
mode: 'Express Courier',
|
|
67
|
+
chargeableWeight: roundTo(chargeableWt, 2),
|
|
68
|
+
volumetricWeight,
|
|
69
|
+
estimatedCost,
|
|
70
|
+
costPerKg: roundTo(estimatedCost / chargeableWt, 2),
|
|
71
|
+
transitDays,
|
|
72
|
+
notes,
|
|
73
|
+
};
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
case 'truck': {
|
|
77
|
+
if (distance == null || distance <= 0)
|
|
78
|
+
return null;
|
|
79
|
+
volumetricWeight = roundTo(volume * 333, 2);
|
|
80
|
+
const chargeableWt = Math.max(weight, volumetricWeight);
|
|
81
|
+
estimatedCost = roundTo(distance * 1.5 + weight * 0.02, 2);
|
|
82
|
+
const transitDaysNum = Math.max(1, Math.ceil(distance / 500));
|
|
83
|
+
transitDays = transitDaysNum === 1 ? '1 day' : `${transitDaysNum}-${transitDaysNum + 1} days`;
|
|
84
|
+
notes = `Rate: $1.50/km + $0.02/kg. Estimated ~${roundTo(distance / 500, 1)} driving days at 500 km/day.`;
|
|
85
|
+
const result = {
|
|
86
|
+
mode: 'Truck',
|
|
87
|
+
chargeableWeight: roundTo(chargeableWt, 2),
|
|
88
|
+
volumetricWeight,
|
|
89
|
+
estimatedCost,
|
|
90
|
+
costPerKg: roundTo(estimatedCost / chargeableWt, 2),
|
|
91
|
+
transitDays,
|
|
92
|
+
notes,
|
|
93
|
+
};
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
default:
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
// For ocean modes
|
|
100
|
+
const chargeableWeight = roundTo(Math.max(weight, volumetricWeight), 2);
|
|
101
|
+
const modeLabels = {
|
|
102
|
+
ocean_fcl: 'Ocean FCL (20ft)',
|
|
103
|
+
ocean_lcl: 'Ocean LCL',
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
mode: modeLabels[mode] ?? mode,
|
|
107
|
+
chargeableWeight,
|
|
108
|
+
volumetricWeight,
|
|
109
|
+
estimatedCost,
|
|
110
|
+
costPerKg: roundTo(estimatedCost / chargeableWeight, 2),
|
|
111
|
+
transitDays,
|
|
112
|
+
notes,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=shipping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipping.js","sourceRoot":"","sources":["../../src/logistics/shipping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TspInput, TspResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Solve the Traveling Salesman Problem
|
|
4
|
+
*
|
|
5
|
+
* Uses nearest neighbor heuristic with 2-opt improvement.
|
|
6
|
+
* For small instances (<=10 nodes), also provides optimal solution via brute force.
|
|
7
|
+
*
|
|
8
|
+
* @param input - Array of nodes with x, y coordinates
|
|
9
|
+
* @returns Tour information and distances
|
|
10
|
+
*/
|
|
11
|
+
export declare function tsp(input: TspInput): TspResult | null;
|
|
12
|
+
//# sourceMappingURL=tsp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsp.d.ts","sourceRoot":"","sources":["../../src/logistics/tsp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAW,MAAM,YAAY,CAAC;AAyG/D;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAoDrD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate Euclidean distance between two nodes
|
|
4
|
+
*/
|
|
5
|
+
function dist(a, b) {
|
|
6
|
+
return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Calculate total tour distance
|
|
10
|
+
*/
|
|
11
|
+
function tourDistance(nodes, tour) {
|
|
12
|
+
let d = 0;
|
|
13
|
+
for (let i = 0; i < tour.length; i++) {
|
|
14
|
+
d += dist(nodes[tour[i]], nodes[tour[(i + 1) % tour.length]]);
|
|
15
|
+
}
|
|
16
|
+
return d;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Nearest neighbor heuristic for TSP
|
|
20
|
+
*/
|
|
21
|
+
function nearestNeighbor(nodes, start) {
|
|
22
|
+
const n = nodes.length;
|
|
23
|
+
const visited = new Uint8Array(n);
|
|
24
|
+
const tour = [start];
|
|
25
|
+
visited[start] = 1;
|
|
26
|
+
for (let step = 1; step < n; step++) {
|
|
27
|
+
const current = tour[tour.length - 1];
|
|
28
|
+
let bestDist = Infinity;
|
|
29
|
+
let bestIdx = -1;
|
|
30
|
+
for (let j = 0; j < n; j++) {
|
|
31
|
+
if (!visited[j]) {
|
|
32
|
+
const d = dist(nodes[current], nodes[j]);
|
|
33
|
+
if (d < bestDist) {
|
|
34
|
+
bestDist = d;
|
|
35
|
+
bestIdx = j;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
tour.push(bestIdx);
|
|
40
|
+
visited[bestIdx] = 1;
|
|
41
|
+
}
|
|
42
|
+
return tour;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 2-opt local improvement for TSP
|
|
46
|
+
*/
|
|
47
|
+
function twoOpt(nodes, tour) {
|
|
48
|
+
const n = tour.length;
|
|
49
|
+
const result = [...tour];
|
|
50
|
+
let improved = true;
|
|
51
|
+
while (improved) {
|
|
52
|
+
improved = false;
|
|
53
|
+
for (let i = 0; i < n - 1; i++) {
|
|
54
|
+
for (let j = i + 2; j < n; j++) {
|
|
55
|
+
if (i === 0 && j === n - 1)
|
|
56
|
+
continue; // skip full reversal
|
|
57
|
+
const a = result[i], b = result[i + 1];
|
|
58
|
+
const c = result[j], d = result[(j + 1) % n];
|
|
59
|
+
const oldDist = dist(nodes[a], nodes[b]) + dist(nodes[c], nodes[d]);
|
|
60
|
+
const newDist = dist(nodes[a], nodes[c]) + dist(nodes[b], nodes[d]);
|
|
61
|
+
if (newDist < oldDist - 1e-10) {
|
|
62
|
+
// reverse segment [i+1 .. j]
|
|
63
|
+
let left = i + 1, right = j;
|
|
64
|
+
while (left < right) {
|
|
65
|
+
[result[left], result[right]] = [result[right], result[left]];
|
|
66
|
+
left++;
|
|
67
|
+
right--;
|
|
68
|
+
}
|
|
69
|
+
improved = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Brute force exact solution for small instances
|
|
78
|
+
*/
|
|
79
|
+
function bruteForce(nodes) {
|
|
80
|
+
if (nodes.length > 10)
|
|
81
|
+
return null;
|
|
82
|
+
const n = nodes.length;
|
|
83
|
+
const indices = Array.from({ length: n - 1 }, (_, i) => i + 1);
|
|
84
|
+
let bestDist = Infinity;
|
|
85
|
+
let bestTour = [];
|
|
86
|
+
// Generate all permutations of indices (nodes 1..n-1, starting from 0)
|
|
87
|
+
function permute(arr, l) {
|
|
88
|
+
if (l === arr.length) {
|
|
89
|
+
const tour = [0, ...arr];
|
|
90
|
+
const d = tourDistance(nodes, tour);
|
|
91
|
+
if (d < bestDist) {
|
|
92
|
+
bestDist = d;
|
|
93
|
+
bestTour = [...tour];
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (let i = l; i < arr.length; i++) {
|
|
98
|
+
[arr[l], arr[i]] = [arr[i], arr[l]];
|
|
99
|
+
permute(arr, l + 1);
|
|
100
|
+
[arr[l], arr[i]] = [arr[i], arr[l]];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
permute(indices, 0);
|
|
104
|
+
return { tour: bestTour, distance: bestDist };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Solve the Traveling Salesman Problem
|
|
108
|
+
*
|
|
109
|
+
* Uses nearest neighbor heuristic with 2-opt improvement.
|
|
110
|
+
* For small instances (<=10 nodes), also provides optimal solution via brute force.
|
|
111
|
+
*
|
|
112
|
+
* @param input - Array of nodes with x, y coordinates
|
|
113
|
+
* @returns Tour information and distances
|
|
114
|
+
*/
|
|
115
|
+
export function tsp(input) {
|
|
116
|
+
const { nodes } = input;
|
|
117
|
+
if (nodes.length < 2) {
|
|
118
|
+
if (nodes.length === 1)
|
|
119
|
+
return {
|
|
120
|
+
nnTour: [0], nnDistance: 0, optimizedTour: [0], optimizedDistance: 0,
|
|
121
|
+
improvementPercent: 0,
|
|
122
|
+
};
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (nodes.length === 2) {
|
|
126
|
+
return {
|
|
127
|
+
nnTour: [0, 1], nnDistance: roundTo(2 * dist(nodes[0], nodes[1]), 2),
|
|
128
|
+
optimizedTour: [0, 1], optimizedDistance: roundTo(2 * dist(nodes[0], nodes[1]), 2),
|
|
129
|
+
improvementPercent: 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// Try all starting points for NN, keep best
|
|
133
|
+
let bestNNTour = [];
|
|
134
|
+
let bestNNDist = Infinity;
|
|
135
|
+
for (let s = 0; s < nodes.length; s++) {
|
|
136
|
+
const tour = nearestNeighbor(nodes, s);
|
|
137
|
+
const d = tourDistance(nodes, tour);
|
|
138
|
+
if (d < bestNNDist) {
|
|
139
|
+
bestNNDist = d;
|
|
140
|
+
bestNNTour = tour;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// 2-opt improvement
|
|
144
|
+
const optimizedTour = twoOpt(nodes, bestNNTour);
|
|
145
|
+
const optimizedDistance = tourDistance(nodes, optimizedTour);
|
|
146
|
+
const improvementPercent = bestNNDist > 0
|
|
147
|
+
? roundTo(((bestNNDist - optimizedDistance) / bestNNDist) * 100, 2)
|
|
148
|
+
: 0;
|
|
149
|
+
const result = {
|
|
150
|
+
nnTour: bestNNTour,
|
|
151
|
+
nnDistance: roundTo(bestNNDist, 2),
|
|
152
|
+
optimizedTour,
|
|
153
|
+
optimizedDistance: roundTo(optimizedDistance, 2),
|
|
154
|
+
improvementPercent,
|
|
155
|
+
};
|
|
156
|
+
// Brute force for small instances
|
|
157
|
+
const bf = bruteForce(nodes);
|
|
158
|
+
if (bf) {
|
|
159
|
+
result.optimalDistance = roundTo(bf.distance, 2);
|
|
160
|
+
result.optimalityGap = result.optimizedDistance > 0
|
|
161
|
+
? roundTo(((optimizedDistance - bf.distance) / bf.distance) * 100, 2)
|
|
162
|
+
: 0;
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=tsp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsp.js","sourceRoot":"","sources":["../../src/logistics/tsp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;GAEG;AACH,SAAS,IAAI,CAAC,CAAU,EAAE,CAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAgB,EAAE,IAAc;IACpD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAgB,EAAE,KAAa;IACtD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAa,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;oBAAC,QAAQ,GAAG,CAAC,CAAC;oBAAC,OAAO,GAAG,CAAC,CAAC;gBAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,KAAgB,EAAE,IAAc;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,OAAO,QAAQ,EAAE,CAAC;QAChB,QAAQ,GAAG,KAAK,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,SAAS,CAAC,qBAAqB;gBAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,IAAI,OAAO,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;oBAC9B,6BAA6B;oBAC7B,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;oBAC5B,OAAO,IAAI,GAAG,KAAK,EAAE,CAAC;wBACpB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC9D,IAAI,EAAE,CAAC;wBAAC,KAAK,EAAE,CAAC;oBAClB,CAAC;oBACD,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,KAAgB;IAClC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,IAAI,QAAQ,GAAa,EAAE,CAAC;IAE5B,uEAAuE;IACvE,SAAS,OAAO,CAAC,GAAa,EAAE,CAAS;QACvC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,CAAC,CAAC;gBAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;gBAC7B,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC;gBACpE,kBAAkB,EAAE,CAAC;aACtB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClF,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC;YAAC,UAAU,GAAG,CAAC,CAAC;YAAC,UAAU,GAAG,IAAI,CAAC;QAAC,CAAC;IAC5D,CAAC;IAED,oBAAoB;IACpB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAE7D,MAAM,kBAAkB,GAAG,UAAU,GAAG,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,iBAAiB,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAc;QACxB,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,aAAa;QACb,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,kBAAkB;KACnB,CAAC;IAEF,kCAAkC;IAClC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC;YACjD,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|