Andrew Cooke | Contents | Latest | RSS | Previous | Next

C[omp]ute

Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Choochoo Training Diary

Last 100 entries

=?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; Surprise Paradox; [Books] Good Author List; [Computing] Efficient queries with grouping in Postgres; [Computing] Automatic Wake (Linux); [Computing] AWS CDK Aspects in Go; [Bike] Adidas Gravel Shoes; [Computing, Horror] Biological Chips; [Books] Weird Lit Recs; [Covid] Extended SIR Models; [Art] York-based Printmaker; [Physics] Quantum Transitions are not Instantaneous; [Computing] AI and Drum Machines; [Computing] Probabilities, Stopping Times, Martingales; bpftrace Intro Article; [Computing] Starlab Systems - Linux Laptops; [Computing] Extended Berkeley Packet Filter; [Green] Mainspring Linear Generator; Better Approach; Rummikub Solver; Chilean Poetry; Felicitations - Empowerment Grant; [Bike] Fixing Spyre Brakes (That Need Constant Adjustment); [Computing, Music] Raspberry Pi Media (Audio) Streamer; [Computing] Amazing Hack To Embed DSL In Python; [Bike] Ruta Del Condor (El Alfalfal); [Bike] Estimating Power On Climbs; [Computing] Applying Azure B2C Authentication To Function Apps; [Bike] Gearing On The Back Of An Envelope; [Computing] Okular and Postscript in OpenSuse; There's a fix!; [Computing] Fail2Ban on OpenSuse Leap 15.3 (NFTables); [Cycling, Computing] Power Calculation and Brakes; [Hardware, Computing] Amazing Pockit Computer; Bullying; How I Am - 3 Years Post Accident, 8+ Years With MS; [USA Politics] In America's Uncivil War Republicans Are The Aggressors; [Programming] Selenium and Python; Better Walking Data; [Bike] How Fast Before Walking More Efficient Than Cycling?; [COVID] Coronavirus And Cycling; [Programming] Docker on OpenSuse; Cadence v Speed; [Bike] Gearing For Real Cyclists; [Programming] React plotting - visx; [Programming] React Leaflet; AliExpress Independent Sellers; Applebaum - Twilight of Democracy; [Politics] Back + US Elections; [Programming,Exercise] Simple Timer Script; [News] 2019: The year revolt went global; [Politics] The world's most-surveilled cities; [Bike] Hope Freehub; [Restaurant] Mama Chau's (Chinese, Providencia); [Politics] Brexit Podcast; [Diary] Pneumonia; [Politics] Britain's Reichstag Fire moment; install cairo; [Programming] GCC Sanitizer Flags; [GPU, Programming] Per-Thread Program Counters; My Bike Accident - Looking Back One Year; [Python] Geographic heights are incredibly easy!; [Cooking] Cookie Recipe; Efficient, Simple, Directed Maximisation of Noisy Function; And for argparse; Bash Completion in Python; [Computing] Configuring Github Jekyll Locally

© 2006-2017 Andrew Cooke (site) / post authors (content).

Rummikub Solver

From: andrew cooke <andrew@...>

Date: Thu, 12 Jan 2023 16:48:36 -0300

I have been working on a solver for Rummikub, but I haven't actually
made much progress.  This email is to note down some of my ideas and
related issues.

The underlying insight is that this is a graph colouring problem.  The
nodes of the graph are the known tiles.  Edges connect any two tiles
that can appear "next to each other" in a group.  The colouring
identifies each group (a successful colouring meets the appropriate
rules).

There may be an efficiency gain in using the previous colouring as a
starting point when searching for a new one.

This is fine as far as it goes.  It becomes more problematic when you
include jokers.

A naive first approach is to include the jokers as additional nodes.
The problem is that these are connected to *every* other node.  This
complicates hugely the search process when trying t find a colouring.

In practice, when you play, you tend to separate things into two
stages: first, liberating a joker and second, using that joker.

Using this approach the joker tiles become "normal" tiles in the graph
(ie take their assumed values) when searching for liberation.  Then,
in the next step, thereare many possible graphs (one for each possible
value of the joker).

I currently don't see how to handle this explosion in the number of
graphs.

So I'm stuck. It seems like the colouring view doesn't reduce the
combinatorial complexity sufficiently.  Or doesn't allow for the
complexity to be reduced using a "natural" compromise.

Andrew

Better Approach

From: andrew cooke <andrew@...>

Date: Sat, 21 Jan 2023 19:56:42 -0300

In the note above I modeled the game as a graph with colourings.  But
things kinda fell apart because I needed multiple graphs.

After thinking some more, it may be better to ditch colourings
altogether and simply search for graphs.  These graphs have
connections only where there are "played" relationships between the
tiles.

Now, the problem with this is that there are an awful lot of possible
graphs.  How do you generate them efficiently (where efficiency
includes memory, speed, and accuracy (generating no or few
"impossible" graphs))?

It seems like there may be a sweet-spot implementation that uses
association tables where each row is in fact a list.  Each entry in
the list describes a locally-consistent set of neigbours (so, for
example, a neigbour that belongs to a run and another that belongs to
a group would not appear in the list together).

To first aproximation the graphs we want to generate are then all the
different combinations possible by selecting one list entry from each
node.

But that ignores remote (contrast w local) consistency - if a node A
has selected node B as part of a run then node B must select A as part
of a run too (for example).

So one can imagine a search process in which selecting a list entry
for one node constraints the available list entries in neghbouring
nodes (in fact, constraints can cascade across multiple connections,
which complicaes things somewhat).  I think this would be most
efficient as a "push" - then the entry is selected all neighbours are
corrected immediately.

Thinking in more detail about the implementation, each list entry
might have a tag that indicates whether it is a run or group locally.
That tag could then have a third value - unused - when filtered by
remote constraints (and maybe a fourth indicating that the tile is
unused).

A further advantage of this approach is that jokers are more naturally
handled (their "assumed value" can be stored in the list entry?).

Andrew

=?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=

From: Tina <freight@...>

Date: Thu, 13 Jun 2024 10:23:46 +0800 (GMT+08:00)

CkhpCgoKCgpHcmVldGluZ3MgZnJvbSBFYXNlRnJlaWdodCEgSSdtIFRpbmEsIHRoZSBGcmVpZ2h0
IE1hbmFnZXIgYXQgRWFzZUZyZWlnaHQsIGFuIEFJIGZyZWlnaHQgYWdlbnQgbmV0d29yayBlc3Rh
Ymxpc2hlZCB1bmRlciBOZXRlYXNlLCBhIENoaW5lc2UgcHVibGljbHkgbGlzdGVkIGNvbXBhbnkg
aW4gMjAwMS4gV2l0aCAxNSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHRoZSBpbXBvcnQgYW5kIGV4
cG9ydCBpbmR1c3RyeSwgd2UgaGF2ZSBnYXRoZXJlZCBvdmVyIDEwLDAwMCBDaGluZXNlIGZyZWln
aHQgYWdlbnRzIHRvIGVuc3VyZSBvdXIgY3VzdG9tZXJzIHJlY2VpdmUgZWZmaWNpZW50IGFuZCBj
b3N0LWVmZmVjdGl2ZSBmcmVpZ2h0IHNlcnZpY2VzLgoKCldlIHN1cHBvcnQgeW91OgoxLk11bHRp
cGxlIGZyZWlnaHQgcXVvdGF0aW9ucyB0byBlbnN1cmUgeW91IGNob29zZSB0aGUgYmVzdCBzb2x1
dGlvbi4KMi5UaGUgcXVvdGF0aW9uIGRldGFpbHMgYXJlIHNwZWNpZmljIGFuZCBjb21wcmVoZW5z
aXZlLCBwcm92aWRpbmcgYSBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGVhY2ggY29zdCBpbnZvbHZl
ZC4KMy5UcmFuc3BhcmVudCBwcmljaW5nLCBubyBtaWRkbGVtYW4gbWFya3Vwcy4KNC5PZmZlcmlu
ZyBhIHZhcmlldHkgb2Ygc2hpcHBpbmcgbWV0aG9kcyBmb3IgZmxleGlibGUgc2VsZWN0aW9uIGJh
c2VkIG9uIHNwZWNpZmljIG5lZWRzLgoKCgoKCldlIGJlbGlldmUgaW4gb3VyIGFiaWxpdHkgdG8g
cHJvdmlkZSB5b3Ugd2l0aCBjdXN0b21pemVkIHNlcnZpY2VzLCBlYXJuaW5nIHlvdXIgcmVjb2du
aXRpb24gdGhyb3VnaCBvdXIgcHJvZmVzc2lvbmFsaXNtLCBjYXBhYmlsaXRpZXMsIHNwZWVkLCBh
bmQgZWZmaWNpZW5jeSwgZW5zdXJpbmcgeW91IGVuam95IHRoZSBiZXN0IHNoaXBwaW5nIHNvbHV0
aW9ucy5QbGVhc2Uga2luZGx5IGNvbnRhY3QgdXMgbm93IGZvciBmcmVlIGNvbnRhaW5lciBzaGlw
cGluZyBxdW90ZSEKCgoKCkJlc3QgcmVnYXJkcywKVGluYSBYaWUKUHJvZHVjdCBPcGVyYXRpb25z
CgpFYXNlRnJlaWdodChOZXRFYXNlKQoKV2Vic2l0ZTpmcmVpZ2h0LmZhY3RvcnkuMTYzLmNvbQpF
LW1haWw6dGluYTAzQGVhc2VmcmllZ2h0aW5jLmNvbQoKCgpBZGRyZXNzOk5ldGVhc2XCreKAlDM5
OSBXYW5nc2hhbmcgUm9hZCwgQmluamlhbmcgRGlzdHJpY3QsIEhhbmd6aG91CgoKCgoKCgoKSWYg
eW91IGRvbid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgZW1haWxzLCB5b3UgY2FuIGVhc2lseSB1bnN1
YnNjcmliZSBoZXJlLgoKCg0KDQo=

=?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=

From: Tina <freight@...>

Date: Tue, 18 Jun 2024 13:40:44 +0800 (GMT+08:00)

CkhpCgoKCgpIaSxuaWNlIHRvIGNvbnRhY3QgeW91IGFnYWluISBJJ20gVGluYSwgZnJlaWdodCBt
YW5hZ2VyIG9mIEVhc2VmcmVpZ2h0LCBmcm9tIHRoZSBBSSBmcmVpZ2h0IGFnZW50IG5ldHdvcmsg
b2YgTmV0RWFzZSwgYSBsaXN0ZWQgY29tcGFueSBpbiBDaGluYS5XZSBhcmUgbm90IGp1c3QgeW91
ciBwb2ludCBvZiBjb250YWN0IHdpdGggZnJlaWdodCBhZ2VudHMsIGJ1dCB5b3VyIGdsb2JhbCB0
cmFkZSBwYXJ0bmVyLCBvZmZlcmluZyBpbnNpZ2h0cyBhbmQgYWR2aWNlIHRvIG5hdmlnYXRlIHRo
ZSBjb21wbGV4aXRpZXMgb2YgaW50ZXJuYXRpb25hbCBzaGlwcGluZy4KCgpXZSBzdXBwb3J0IHlv
dToKIDEuT2ZmZXJzIGRlZGljYXRlZCBvbmUtb24tb25lIGN1c3RvbWVyIHNlcnZpY2UgcmVwcmVz
ZW50YXRpdmVzIGFuZCBwcm9tcHQgcXVvdGF0aW9ucwogMi5PZmZlciB0YWlsb3JlZCBmcmVpZ2h0
IHNvbHV0aW9ucyB0byBtZWV0IHRoZSB1bmlxdWUgcmVxdWlyZW1lbnRzIG9mIG91ciBjbGllbnRz
LgogMy5Qcm92aWRpbmcgcmVsaWFibGUgZnJlaWdodCBwYXJ0bmVycyBhbmQgaGF2ZSBvZmZpY2Vz
IGluIG1ham9yIHBvcnRzIGZvciBvbi1zaXRlIGF1ZGl0cwoKCk91ciBjdXN0b21lciBzdXBwb3J0
IHRlYW0gaXMgYWx3YXlzIHJlYWR5IHRvIGFzc2lzdCB3aXRoIGFueSBpbnF1aXJpZXMsIGVuc3Vy
aW5nIGEgc21vb3RoIGFuZCB3b3JyeS1mcmVlIGV4cGVyaWVuY2UuUGxlYXNlIGtpbmRseSByZXBs
eSB0byBnZXQgdGhlIGxhdGVzdCBmcmVlIG9mIGNoYXJnZSBDaGluYSBzaGlwcGluZyBxdW90ZXMh
CgoKCgoKQmVzdCByZWdhcmRzLApUaW5hIFhpZQpQcm9kdWN0IE9wZXJhdGlvbnMKCkVhc2VGcmVp
Z2h0KE5ldEVhc2UpCgpXZWJzaXRlOmZyZWlnaHQuZmFjdG9yeS4xNjMuY29tCkUtbWFpbDp0aW5h
MDNAZWFzZWZyaWVnaHRpbmMuY29tCgoKCkFkZHJlc3M6TmV0ZWFzZcKt4oCUMzk5IFdhbmdzaGFu
ZyBSb2FkLCBCaW5qaWFuZyBEaXN0cmljdCwgSGFuZ3pob3UKCgoKCgoKCgpJZiB5b3UgZG9uJ3Qg
d2FudCB0byByZWNlaXZlIG91ciBlbWFpbHMsIHlvdSBjYW4gZWFzaWx5IHVuc3Vic2NyaWJlIGhl
cmUuCgoKCuWcqDIwMjQtMDYtMTPvvIxUaW5hIDxmcmVpZ2h0QGxvZ2lzdGljc2dsb2JhbHRyYWRl
LmNvbT4g5YaZ6YGTOi0tLS0t5Y6f5aeL6YKu5Lu2LS0tLS0KIOWPkeS7tuS6uu+8miBUaW5hIDxm
cmVpZ2h0QGxvZ2lzdGljc2dsb2JhbHRyYWRlLmNvbT4KIOWPkeS7tuaXtumXtDogMjAyNOW5tDA2
5pyIMTPml6Ug5ZGo5ZubCiDmlLbku7bkurrvvJogW2NvbXB1dGUrcnVtbWlrdWJzbzBAYWNvb2tl
Lm9yZ10KIOS4u+mimO+8miBUaGUgYmVzdCBjdXN0b21pemVkIGZyZWlnaHQgc29sdXRpb24gZnJv
bSBFYXNlIGZyZWlnaHQKCgpIaQoKCgoKR3JlZXRpbmdzIGZyb20gRWFzZUZyZWlnaHQhIEknbSBU
aW5hLCB0aGUgRnJlaWdodCBNYW5hZ2VyIGF0IEVhc2VGcmVpZ2h0LCBhbiBBSSBmcmVpZ2h0IGFn
ZW50IG5ldHdvcmsgZXN0YWJsaXNoZWQgdW5kZXIgTmV0ZWFzZSwgYSBDaGluZXNlIHB1YmxpY2x5
IGxpc3RlZCBjb21wYW55IGluIDIwMDEuIFdpdGggMTUgeWVhcnMgb2YgZXhwZXJpZW5jZSBpbiB0
aGUgaW1wb3J0IGFuZCBleHBvcnQgaW5kdXN0cnksIHdlIGhhdmUgZ2F0aGVyZWQgb3ZlciAxMCww
MDAgQ2hpbmVzZSBmcmVpZ2h0IGFnZW50cyB0byBlbnN1cmUgb3VyIGN1c3RvbWVycyByZWNlaXZl
IGVmZmljaWVudCBhbmQgY29zdC1lZmZlY3RpdmUgZnJlaWdodCBzZXJ2aWNlcy4KCgpXZSBzdXBw
b3J0IHlvdToKIDEuTXVsdGlwbGUgZnJlaWdodCBxdW90YXRpb25zIHRvIGVuc3VyZSB5b3UgY2hv
b3NlIHRoZSBiZXN0IHNvbHV0aW9uLgogMi5UaGUgcXVvdGF0aW9uIGRldGFpbHMgYXJlIHNwZWNp
ZmljIGFuZCBjb21wcmVoZW5zaXZlLCBwcm92aWRpbmcgYSBjbGVhciB1bmRlcnN0YW5kaW5nIG9m
IGVhY2ggY29zdCBpbnZvbHZlZC4KIDMuVHJhbnNwYXJlbnQgcHJpY2luZywgbm8gbWlkZGxlbWFu
IG1hcmt1cHMuCiA0Lk9mZmVyaW5nIGEgdmFyaWV0eSBvZiBzaGlwcGluZyBtZXRob2RzIGZvciBm
bGV4aWJsZSBzZWxlY3Rpb24gYmFzZWQgb24gc3BlY2lmaWMgbmVlZHMuCgoKCgoKV2UgYmVsaWV2
ZSBpbiBvdXIgYWJpbGl0eSB0byBwcm92aWRlIHlvdSB3aXRoIGN1c3RvbWl6ZWQgc2VydmljZXMs
IGVhcm5pbmcgeW91ciByZWNvZ25pdGlvbiB0aHJvdWdoIG91ciBwcm9mZXNzaW9uYWxpc20sIGNh
cGFiaWxpdGllcywgc3BlZWQsIGFuZCBlZmZpY2llbmN5LCBlbnN1cmluZyB5b3UgZW5qb3kgdGhl
IGJlc3Qgc2hpcHBpbmcgc29sdXRpb25zLlBsZWFzZSBraW5kbHkgY29udGFjdCB1cyBub3cgZm9y
IGZyZWUgY29udGFpbmVyIHNoaXBwaW5nIHF1b3RlIQoKCgoKQmVzdCByZWdhcmRzLApUaW5hIFhp
ZQpQcm9kdWN0IE9wZXJhdGlvbnMKCkVhc2VGcmVpZ2h0KE5ldEVhc2UpCgpXZWJzaXRlOmZyZWln
aHQuZmFjdG9yeS4xNjMuY29tCkUtbWFpbDp0aW5hMDNAZWFzZWZyaWVnaHRpbmMuY29tCgoKCkFk
ZHJlc3M6TmV0ZWFzZcKt4oCUMzk5IFdhbmdzaGFuZyBSb2FkLCBCaW5qaWFuZyBEaXN0cmljdCwg
SGFuZ3pob3UKCgoKCgoKCgpJZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIG91ciBlbWFpbHMs
IHlvdSBjYW4gZWFzaWx5IHVuc3Vic2NyaWJlIGhlcmUuCgoKCgoNCg0K

=?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=

From: Tina <freight@...>

Date: Thu, 18 Jul 2024 20:35:55 +0800 (GMT+08:00)

CkhpCgoKCgpHcmVldGluZ3MgZnJvbSBFYXNlRnJlaWdodCEgSSdtIFRpbmEsIHRoZSBGcmVpZ2h0
IE1hbmFnZXIgYXQgRWFzZUZyZWlnaHQsIGFuIEFJIGZyZWlnaHQgYWdlbnQgbmV0d29yayBlc3Rh
Ymxpc2hlZCB1bmRlciBOZXRlYXNlLCBhIENoaW5lc2UgcHVibGljbHkgbGlzdGVkIGNvbXBhbnkg
aW4gMjAwMS4gV2l0aCAxNSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHRoZSBpbXBvcnQgYW5kIGV4
cG9ydCBpbmR1c3RyeSwgd2UgaGF2ZSBnYXRoZXJlZCBvdmVyIDEwLDAwMCBDaGluZXNlIGZyZWln
aHQgYWdlbnRzIHRvIGVuc3VyZSBvdXIgY3VzdG9tZXJzIHJlY2VpdmUgZWZmaWNpZW50IGFuZCBj
b3N0LWVmZmVjdGl2ZSBmcmVpZ2h0IHNlcnZpY2VzLgoKCldlIHN1cHBvcnQgeW91OgogMS5NdWx0
aXBsZSBmcmVpZ2h0IHF1b3RhdGlvbnMgdG8gZW5zdXJlIHlvdSBjaG9vc2UgdGhlIGJlc3Qgc29s
dXRpb24uCiAyLlRoZSBxdW90YXRpb24gZGV0YWlscyBhcmUgc3BlY2lmaWMgYW5kIGNvbXByZWhl
bnNpdmUsIHByb3ZpZGluZyBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgZWFjaCBjb3N0IGludm9s
dmVkLgogMy5UcmFuc3BhcmVudCBwcmljaW5nLCBubyBtaWRkbGVtYW4gbWFya3Vwcy4KIDQuT2Zm
ZXJpbmcgYSB2YXJpZXR5IG9mIHNoaXBwaW5nIG1ldGhvZHMgZm9yIGZsZXhpYmxlIHNlbGVjdGlv
biBiYXNlZCBvbiBzcGVjaWZpYyBuZWVkcy4KCgoKCgpXZSBiZWxpZXZlIGluIG91ciBhYmlsaXR5
IHRvIHByb3ZpZGUgeW91IHdpdGggY3VzdG9taXplZCBzZXJ2aWNlcywgZWFybmluZyB5b3VyIHJl
Y29nbml0aW9uIHRocm91Z2ggb3VyIHByb2Zlc3Npb25hbGlzbSwgY2FwYWJpbGl0aWVzLCBzcGVl
ZCwgYW5kIGVmZmljaWVuY3ksIGVuc3VyaW5nIHlvdSBlbmpveSB0aGUgYmVzdCBzaGlwcGluZyBz
b2x1dGlvbnMuUGxlYXNlIGtpbmRseSBjb250YWN0IHVzIG5vdyBmb3IgZnJlZSBjb250YWluZXIg
c2hpcHBpbmcgcXVvdGUhCgoKCgpCZXN0IHJlZ2FyZHMsClRpbmEgWGllCkN1c3RvbWVyIFJlcHJl
c2VudGF0aXZlCgpFYXNlRnJlaWdodCAoU3Vic2lkaWFyeSBvZiBOZXRFYXNlKQoKV2Vic2l0ZTog
ZWFzZS1mcmVpZ2h0LmNvbQpFLW1haWw6IHRpbmFAZWFzZWZyZWlnaHRpbmMuY29tCgoKCkFkZHJl
c3M6IE5ldGVhc2XCreKAlDM5OSBXYW5nc2hhbmcgUm9hZCwgQmluamlhbmcgRGlzdHJpY3QsIEhh
bmd6aG91CgoKCgoKCgoKCgoKSWYgeW91IGRvbid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgZW1haWxz
LCB5b3UgY2FuIGVhc2lseSB1bnN1YnNjcmliZSBoZXJlLgoKCgrlnKgyMDI0LTA2LTEz77yMVGlu
YSA8ZnJlaWdodEBsb2dpc3RpY3NnbG9iYWx0cmFkZS5jb20+IOWGmemBkzotLS0tLeWOn+Wni+mC
ruS7ti0tLS0tCiDlj5Hku7bkurrvvJogVGluYSA8ZnJlaWdodEBsb2dpc3RpY3NnbG9iYWx0cmFk
ZS5jb20+CiDlj5Hku7bml7bpl7Q6IDIwMjTlubQwNuaciDEz5pelIOWRqOWbmwog5pS25Lu25Lq6
77yaIFtjb21wdXRlK3J1bW1pa3Vic28wQGFjb29rZS5vcmddCiDkuLvpopjvvJogVGhlIGJlc3Qg
Y3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0CgoKSGkKCgoKCkdy
ZWV0aW5ncyBmcm9tIEVhc2VGcmVpZ2h0ISBJJ20gVGluYSwgdGhlIEZyZWlnaHQgTWFuYWdlciBh
dCBFYXNlRnJlaWdodCwgYW4gQUkgZnJlaWdodCBhZ2VudCBuZXR3b3JrIGVzdGFibGlzaGVkIHVu
ZGVyIE5ldGVhc2UsIGEgQ2hpbmVzZSBwdWJsaWNseSBsaXN0ZWQgY29tcGFueSBpbiAyMDAxLiBX
aXRoIDE1IHllYXJzIG9mIGV4cGVyaWVuY2UgaW4gdGhlIGltcG9ydCBhbmQgZXhwb3J0IGluZHVz
dHJ5LCB3ZSBoYXZlIGdhdGhlcmVkIG92ZXIgMTAsMDAwIENoaW5lc2UgZnJlaWdodCBhZ2VudHMg
dG8gZW5zdXJlIG91ciBjdXN0b21lcnMgcmVjZWl2ZSBlZmZpY2llbnQgYW5kIGNvc3QtZWZmZWN0
aXZlIGZyZWlnaHQgc2VydmljZXMuCgoKV2Ugc3VwcG9ydCB5b3U6CiAxLk11bHRpcGxlIGZyZWln
aHQgcXVvdGF0aW9ucyB0byBlbnN1cmUgeW91IGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4KIDIu
VGhlIHF1b3RhdGlvbiBkZXRhaWxzIGFyZSBzcGVjaWZpYyBhbmQgY29tcHJlaGVuc2l2ZSwgcHJv
dmlkaW5nIGEgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBlYWNoIGNvc3QgaW52b2x2ZWQuCiAzLlRy
YW5zcGFyZW50IHByaWNpbmcsIG5vIG1pZGRsZW1hbiBtYXJrdXBzLgogNC5PZmZlcmluZyBhIHZh
cmlldHkgb2Ygc2hpcHBpbmcgbWV0aG9kcyBmb3IgZmxleGlibGUgc2VsZWN0aW9uIGJhc2VkIG9u
IHNwZWNpZmljIG5lZWRzLgoKCgoKCldlIGJlbGlldmUgaW4gb3VyIGFiaWxpdHkgdG8gcHJvdmlk
ZSB5b3Ugd2l0aCBjdXN0b21pemVkIHNlcnZpY2VzLCBlYXJuaW5nIHlvdXIgcmVjb2duaXRpb24g
dGhyb3VnaCBvdXIgcHJvZmVzc2lvbmFsaXNtLCBjYXBhYmlsaXRpZXMsIHNwZWVkLCBhbmQgZWZm
aWNpZW5jeSwgZW5zdXJpbmcgeW91IGVuam95IHRoZSBiZXN0IHNoaXBwaW5nIHNvbHV0aW9ucy5Q
bGVhc2Uga2luZGx5IGNvbnRhY3QgdXMgbm93IGZvciBmcmVlIGNvbnRhaW5lciBzaGlwcGluZyBx
dW90ZSEKCgoKCkJlc3QgcmVnYXJkcywKVGluYSBYaWUKUHJvZHVjdCBPcGVyYXRpb25zCgpFYXNl
RnJlaWdodChOZXRFYXNlKQoKV2Vic2l0ZTpmcmVpZ2h0LmZhY3RvcnkuMTYzLmNvbQpFLW1haWw6
dGluYTAzQGVhc2VmcmllZ2h0aW5jLmNvbQoKCgpBZGRyZXNzOk5ldGVhc2XCreKAlDM5OSBXYW5n
c2hhbmcgUm9hZCwgQmluamlhbmcgRGlzdHJpY3QsIEhhbmd6aG91CgoKCgoKCgoKSWYgeW91IGRv
bid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgZW1haWxzLCB5b3UgY2FuIGVhc2lseSB1bnN1YnNjcmli
ZSBoZXJlLgoKCgoKDQoNCg==

Comment on this post