← back to Tk10640 Redirect Prune
TK-10640: read-only redirect-cap analysis + gated prune plan (32,120 redirect-to-home rows, verified 0 live-product impact)
8d40896726e8c0b99733f4e7acef56dd9e463355 · 2026-08-17 23:20:34 -0700 · steve
Files touched
A .gitignoreA apply-prune-to-home.mjsA data/cand-chain.jsonlA data/cand-empty.jsonlA data/cand-self.jsonlA data/classify-summary.jsonA data/status-tally.jsonA probe-source-liveness.mjsA pull-and-classify.mjsA status-probe.mjs
Diff
commit 8d40896726e8c0b99733f4e7acef56dd9e463355
Author: steve <steve@designerwallcoverings.com>
Date: Mon Aug 17 23:20:34 2026 -0700
TK-10640: read-only redirect-cap analysis + gated prune plan (32,120 redirect-to-home rows, verified 0 live-product impact)
---
.gitignore | 8 ++
apply-prune-to-home.mjs | 43 ++++++++++
data/cand-chain.jsonl | 200 +++++++++++++++++++++++++++++++++++++++++++++
data/cand-empty.jsonl | 200 +++++++++++++++++++++++++++++++++++++++++++++
data/cand-self.jsonl | 0
data/classify-summary.json | 20 +++++
data/status-tally.json | 11 +++
probe-source-liveness.mjs | 29 +++++++
pull-and-classify.mjs | 79 ++++++++++++++++++
status-probe.mjs | 18 ++++
10 files changed, 608 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..362cac8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+.env*
+tmp/
+*.log
+.DS_Store
+data/redirects-dump.jsonl
+data/done-*.jsonl
+data/*.err
diff --git a/apply-prune-to-home.mjs b/apply-prune-to-home.mjs
new file mode 100644
index 0000000..2736f53
--- /dev/null
+++ b/apply-prune-to-home.mjs
@@ -0,0 +1,43 @@
+// TK-10640 — GATED APPLY: prune the "redirect -> homepage" class to free cap space.
+// Targets ONLY redirects whose target is "/" or empty (verified-safe class: 32,120 rows,
+// of which 32,045 are /products/<handle> with source NEVER ACTIVE+published, +75 legacy junk).
+// DRY-RUN by default. --apply performs urlRedirectDelete. Resumable (done log).
+// BELT-AND-SUSPENDERS: before deleting a /products/<h> -> / redirect, re-check the source
+// handle is NOT an ACTIVE+published product (onlineStoreUrl null). If it IS live, SKIP +
+// flag (would be a hijack we must NOT silently delete without review).
+// Uses SHOPIFY_FULL_ACCESS_TOKEN (only content-scoped token). NEVER run --apply without
+// Steve's go — this file is drafted to pending-approval; the loop does not fire it.
+import { readFileSync, appendFileSync, existsSync } from 'node:fs';
+const txt=readFileSync(`${process.env.HOME}/Projects/secrets-manager/.env`,'utf8');
+const env={}; for(const l of txt.split('\n')){const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m) env[m[1]]=m[2].replace(/^["']|["']$/g,'');}
+const STORE=env.SHOPIFY_STORE_DOMAIN, TOKEN=env.SHOPIFY_FULL_ACCESS_TOKEN, API='2024-10';
+const APPLY=process.argv.includes('--apply');
+const LIMIT=Number((process.argv.find(a=>a.startsWith('--limit='))||'').split('=')[1]||Infinity);
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v={}){for(let a=0;a<10;a++){try{const res=await fetch(`https://${STORE}/admin/api/${API}/graphql.json`,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});const tx=await res.text();let j;try{j=JSON.parse(tx);}catch{await sleep(1500*(a+1));continue;}if(j.errors){if(/THROTTLED/i.test(JSON.stringify(j.errors))){await sleep(1500*(a+1));continue;}throw new Error(JSON.stringify(j.errors));}return j.data;}catch(e){if(a<9){await sleep(1500*(a+1));continue;}throw e;}}}
+const DONE=`${process.env.HOME}/Projects/tk10640-redirect-prune/data/done-prune-to-home.jsonl`;
+const done=new Set(); if(existsSync(DONE)) for(const l of readFileSync(DONE,'utf8').split('\n')) if(l.trim()) done.add(JSON.parse(l).id);
+const DEL=`mutation($id:ID!){ urlRedirectDelete(id:$id){ deletedUrlRedirectId userErrors{ message } } }`;
+const rows=readFileSync(`${process.env.HOME}/Projects/tk10640-redirect-prune/data/redirects-dump.jsonl`,'utf8').trim().split('\n').map(JSON.parse);
+const norm=s=>(s||'').split('?')[0].split('#')[0];
+const toHome=rows.filter(r=>{const t=norm(r.target);return !t||t==='/';});
+let scanned=0,deleted=0,skipped_live=0,err=0;
+for(const r of toHome){
+ if(done.has(r.id)) continue;
+ scanned++;
+ // belt-and-suspenders live re-check for product sources
+ if(/^\/products\//.test(r.path)){
+ const h=r.path.replace(/^\/products\//,'').split('?')[0].split('#')[0];
+ const d=await gql(`query($h:String!){productByHandle(handle:$h){status onlineStoreUrl}}`,{h});
+ const p=d.productByHandle;
+ if(p && p.status==='ACTIVE' && p.onlineStoreUrl){ skipped_live++; appendFileSync(DONE,JSON.stringify({id:r.id,path:r.path,skipped:'LIVE_ACTIVE_PUBLISHED'})+'\n'); continue; }
+ }
+ if(APPLY){
+ const del=await gql(DEL,{id:r.id});
+ if(del.urlRedirectDelete.userErrors.length){ err++; }
+ else { deleted++; appendFileSync(DONE,JSON.stringify({id:r.id,path:r.path,deleted:true})+'\n'); }
+ }
+ if(scanned%2500===0) process.stderr.write(` scanned ${scanned}, deleted ${deleted}, skipped_live ${skipped_live}\n`);
+ if(deleted>=LIMIT){ process.stderr.write(`hit --limit=${LIMIT}\n`); break; }
+}
+console.log(JSON.stringify({mode:APPLY?'APPLY':'DRY-RUN',to_home_total:toHome.length,scanned,deleted,skipped_live_active_published:skipped_live,errors:err},null,2));
diff --git a/data/cand-chain.jsonl b/data/cand-chain.jsonl
new file mode 100644
index 0000000..76731d0
--- /dev/null
+++ b/data/cand-chain.jsonl
@@ -0,0 +1,200 @@
+{"id":"gid://shopify/UrlRedirect/71053082689","path":"/wallpaperstore/pacific-island-banana-leaves-in-the-wind-mural-p-116592.html","target":"/products/pacific-island-banana-leaves-in-the-wind-mural-cor-23303"}
+{"id":"gid://shopify/UrlRedirect/71053115457","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116592","target":"/products/pacific-island-banana-leaves-in-the-wind-mural-cor-23303"}
+{"id":"gid://shopify/UrlRedirect/71054065729","path":"/wallpaperstore/pina-pastel-jungle-banana-leaves-p-116577.html","target":"/products/pina-pastel-jungle-banana-leaves-cor-23288"}
+{"id":"gid://shopify/UrlRedirect/71054098497","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116577","target":"/products/pina-pastel-jungle-banana-leaves-cor-23288"}
+{"id":"gid://shopify/UrlRedirect/71054131265","path":"/wallpaperstore/pina-pastel-jungle-banana-leaves-p-116576.html","target":"/products/pina-pastel-jungle-banana-leaves-cor-23287"}
+{"id":"gid://shopify/UrlRedirect/71054164033","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116576","target":"/products/pina-pastel-jungle-banana-leaves-cor-23287"}
+{"id":"gid://shopify/UrlRedirect/71054196801","path":"/wallpaperstore/pina-pastel-jungle-banana-leaves-p-116575.html","target":"/products/pina-pastel-jungle-banana-leaves-cor-23286"}
+{"id":"gid://shopify/UrlRedirect/71054229569","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116575","target":"/products/pina-pastel-jungle-banana-leaves-cor-23286"}
+{"id":"gid://shopify/UrlRedirect/71054262337","path":"/wallpaperstore/pina-pastel-jungle-banana-leaves-p-116574.html","target":"/products/pina-pastel-jungle-banana-leaves-cor-23285"}
+{"id":"gid://shopify/UrlRedirect/71054295105","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116574","target":"/products/pina-pastel-jungle-banana-leaves-cor-23285"}
+{"id":"gid://shopify/UrlRedirect/71058063425","path":"/wallpaperstore/placid-paglia-banana-leaves-p-116516.html","target":"/products/placid-paglia-banana-leaves-cor-23227"}
+{"id":"gid://shopify/UrlRedirect/71058096193","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116516","target":"/products/placid-paglia-banana-leaves-cor-23227"}
+{"id":"gid://shopify/UrlRedirect/71058128961","path":"/wallpaperstore/placid-paglia-banana-leaves-p-116515.html","target":"/products/placid-paglia-banana-leaves-cor-23226"}
+{"id":"gid://shopify/UrlRedirect/71058161729","path":"/wallpaperstore/index.php?cpath=1604_6367&main_page=product_info&products_id=116515","target":"/products/placid-paglia-banana-leaves-cor-23226"}
+{"id":"gid://shopify/UrlRedirect/71142408257","path":"/wallpaperstore/saguro-p-115027.html","target":"/products/saguro-rldw-20097"}
+{"id":"gid://shopify/UrlRedirect/71142441025","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115027","target":"/products/saguro-rldw-20097"}
+{"id":"gid://shopify/UrlRedirect/71142473793","path":"/wallpaperstore/yukata-p-115026.html","target":"/products/yukata-rldw-20096"}
+{"id":"gid://shopify/UrlRedirect/71142506561","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115026","target":"/products/yukata-rldw-20096"}
+{"id":"gid://shopify/UrlRedirect/71142539329","path":"/wallpaperstore/ionian-sea-linen-p-115025.html","target":"/products/ionian-sea-linen-rldw-20095"}
+{"id":"gid://shopify/UrlRedirect/71142572097","path":"/wallpaperstore/index.php?cpath=1604_6358_6348&main_page=product_info&products_id=115025","target":"/products/ionian-sea-linen-rldw-20095"}
+{"id":"gid://shopify/UrlRedirect/71142604865","path":"/wallpaperstore/ionian-sea-linen-p-115024.html","target":"/products/ionian-sea-linen-rldw-20094"}
+{"id":"gid://shopify/UrlRedirect/71142637633","path":"/wallpaperstore/index.php?cpath=1604_6358_6348&main_page=product_info&products_id=115024","target":"/products/ionian-sea-linen-rldw-20094"}
+{"id":"gid://shopify/UrlRedirect/71142670401","path":"/wallpaperstore/ionian-sea-linen-p-115023.html","target":"/products/ionian-sea-linen-rldw-20093"}
+{"id":"gid://shopify/UrlRedirect/71142703169","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115023","target":"/products/ionian-sea-linen-rldw-20093"}
+{"id":"gid://shopify/UrlRedirect/71142735937","path":"/wallpaperstore/ionian-sea-linen-p-115022.html","target":"/products/ionian-sea-linen-rldw-20092"}
+{"id":"gid://shopify/UrlRedirect/71142768705","path":"/wallpaperstore/index.php?cpath=1604_6358_6348&main_page=product_info&products_id=115022","target":"/products/ionian-sea-linen-rldw-20092"}
+{"id":"gid://shopify/UrlRedirect/71142801473","path":"/wallpaperstore/topanga-canyon-p-115021.html","target":"/products/topanga-canyon-rldw-20091"}
+{"id":"gid://shopify/UrlRedirect/71142834241","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115021","target":"/products/topanga-canyon-rldw-20091"}
+{"id":"gid://shopify/UrlRedirect/71142867009","path":"/wallpaperstore/topanga-canyon-p-115020.html","target":"/products/topanga-canyon-rldw-20090"}
+{"id":"gid://shopify/UrlRedirect/71142899777","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115020","target":"/products/topanga-canyon-rldw-20090"}
+{"id":"gid://shopify/UrlRedirect/71142932545","path":"/wallpaperstore/topanga-canyon-p-115019.html","target":"/products/topanga-canyon-rldw-20089"}
+{"id":"gid://shopify/UrlRedirect/71142965313","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115019","target":"/products/topanga-canyon-rldw-20089"}
+{"id":"gid://shopify/UrlRedirect/71142998081","path":"/wallpaperstore/la-jolla-p-115018.html","target":"/products/la-jolla-rldw-20088"}
+{"id":"gid://shopify/UrlRedirect/71143030849","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115018","target":"/products/la-jolla-rldw-20088"}
+{"id":"gid://shopify/UrlRedirect/71143063617","path":"/wallpaperstore/la-jolla-p-115017.html","target":"/products/la-jolla-rldw-20087"}
+{"id":"gid://shopify/UrlRedirect/71143096385","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115017","target":"/products/la-jolla-rldw-20087"}
+{"id":"gid://shopify/UrlRedirect/71143129153","path":"/wallpaperstore/coronado-p-115016.html","target":"/products/coronado-rldw-20086"}
+{"id":"gid://shopify/UrlRedirect/71143161921","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115016","target":"/products/coronado-rldw-20086"}
+{"id":"gid://shopify/UrlRedirect/71143194689","path":"/wallpaperstore/coronado-p-115015.html","target":"/products/coronado-rldw-20085"}
+{"id":"gid://shopify/UrlRedirect/71143227457","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115015","target":"/products/coronado-rldw-20085"}
+{"id":"gid://shopify/UrlRedirect/71143260225","path":"/wallpaperstore/yuri-p-115014.html","target":"/products/yuri-rldw-20084"}
+{"id":"gid://shopify/UrlRedirect/71143292993","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115014","target":"/products/yuri-rldw-20084"}
+{"id":"gid://shopify/UrlRedirect/71143325761","path":"/wallpaperstore/sansai-p-115013.html","target":"/products/sansai-rldw-20083"}
+{"id":"gid://shopify/UrlRedirect/71143358529","path":"/wallpaperstore/index.php?cpath=1604_6358_6347&main_page=product_info&products_id=115013","target":"/products/sansai-rldw-20083"}
+{"id":"gid://shopify/UrlRedirect/71143391297","path":"/wallpaperstore/tanzania-fl-p-115012.html","target":"/products/tanzania-fl-rldw-20082"}
+{"id":"gid://shopify/UrlRedirect/71143424065","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115012","target":"/products/tanzania-fl-rldw-20082"}
+{"id":"gid://shopify/UrlRedirect/71143456833","path":"/wallpaperstore/marrakech-p-115011.html","target":"/products/marrakech-rldw-20081"}
+{"id":"gid://shopify/UrlRedirect/71143489601","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115011","target":"/products/marrakech-rldw-20081"}
+{"id":"gid://shopify/UrlRedirect/71143522369","path":"/wallpaperstore/maharaja-weave-p-115010.html","target":"/products/maharaja-weave-rldw-20080"}
+{"id":"gid://shopify/UrlRedirect/71143555137","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115010","target":"/products/maharaja-weave-rldw-20080"}
+{"id":"gid://shopify/UrlRedirect/71143587905","path":"/wallpaperstore/spa-weave-p-115009.html","target":"/products/spa-weave-rldw-20079"}
+{"id":"gid://shopify/UrlRedirect/71143620673","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115009","target":"/products/spa-weave-rldw-20079"}
+{"id":"gid://shopify/UrlRedirect/71143653441","path":"/wallpaperstore/arum-twill-p-115008.html","target":"/products/arum-twill-rldw-20078"}
+{"id":"gid://shopify/UrlRedirect/71143686209","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115008","target":"/products/arum-twill-rldw-20078"}
+{"id":"gid://shopify/UrlRedirect/71143784513","path":"/wallpaperstore/amber-mountain-emb-p-115006.html","target":"/products/amber-mountain-emb-rldw-20076"}
+{"id":"gid://shopify/UrlRedirect/71143817281","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115006","target":"/products/amber-mountain-emb-rldw-20076"}
+{"id":"gid://shopify/UrlRedirect/71143850049","path":"/wallpaperstore/walled-city-geom-p-115005.html","target":"/products/walled-city-geom-rldw-20075"}
+{"id":"gid://shopify/UrlRedirect/71143882817","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115005","target":"/products/walled-city-geom-rldw-20075"}
+{"id":"gid://shopify/UrlRedirect/71143915585","path":"/wallpaperstore/serengeti-seagrass-p-115004.html","target":"/products/serengeti-seagrass-rldw-20074"}
+{"id":"gid://shopify/UrlRedirect/71143948353","path":"/wallpaperstore/index.php?cpath=1604_6358_6350&main_page=product_info&products_id=115004","target":"/products/serengeti-seagrass-rldw-20074"}
+{"id":"gid://shopify/UrlRedirect/71143981121","path":"/wallpaperstore/herringbone-p-115003.html","target":"/products/herringbone-rldw-20073"}
+{"id":"gid://shopify/UrlRedirect/71144013889","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115003","target":"/products/herringbone-rldw-20073"}
+{"id":"gid://shopify/UrlRedirect/71144046657","path":"/wallpaperstore/herringbone-p-115002.html","target":"/products/herringbone-rldw-20072"}
+{"id":"gid://shopify/UrlRedirect/71144079425","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115002","target":"/products/herringbone-rldw-20072"}
+{"id":"gid://shopify/UrlRedirect/71144112193","path":"/wallpaperstore/herringbone-p-115001.html","target":"/products/herringbone-rldw-20071"}
+{"id":"gid://shopify/UrlRedirect/71144144961","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115001","target":"/products/herringbone-rldw-20071"}
+{"id":"gid://shopify/UrlRedirect/71144177729","path":"/wallpaperstore/herringbone-p-115000.html","target":"/products/herringbone-rldw-20070"}
+{"id":"gid://shopify/UrlRedirect/71144210497","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=115000","target":"/products/herringbone-rldw-20070"}
+{"id":"gid://shopify/UrlRedirect/71144243265","path":"/wallpaperstore/bamami-weave-p-114999.html","target":"/products/bamami-weave-rldw-20069"}
+{"id":"gid://shopify/UrlRedirect/71144276033","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114999","target":"/products/bamami-weave-rldw-20069"}
+{"id":"gid://shopify/UrlRedirect/71144308801","path":"/wallpaperstore/bamami-weave-p-114998.html","target":"/products/bamami-weave-rldw-20068"}
+{"id":"gid://shopify/UrlRedirect/71144341569","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114998","target":"/products/bamami-weave-rldw-20068"}
+{"id":"gid://shopify/UrlRedirect/71144374337","path":"/wallpaperstore/painters-linen-p-114997.html","target":"/products/painter-s-linen-rldw-20067"}
+{"id":"gid://shopify/UrlRedirect/71144407105","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114997","target":"/products/painter-s-linen-rldw-20067"}
+{"id":"gid://shopify/UrlRedirect/71144439873","path":"/wallpaperstore/painters-linen-p-114996.html","target":"/products/painter-s-linen-rldw-20066"}
+{"id":"gid://shopify/UrlRedirect/71144472641","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114996","target":"/products/painter-s-linen-rldw-20066"}
+{"id":"gid://shopify/UrlRedirect/71144505409","path":"/wallpaperstore/painters-linen-p-114995.html","target":"/products/painter-s-linen-rldw-20065"}
+{"id":"gid://shopify/UrlRedirect/71144538177","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114995","target":"/products/painter-s-linen-rldw-20065"}
+{"id":"gid://shopify/UrlRedirect/71144570945","path":"/wallpaperstore/painters-linen-p-114994.html","target":"/products/painter-s-linen-rldw-20064"}
+{"id":"gid://shopify/UrlRedirect/71144603713","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114994","target":"/products/painter-s-linen-rldw-20064"}
+{"id":"gid://shopify/UrlRedirect/71144636481","path":"/wallpaperstore/barsham-metallc-weave-p-114993.html","target":"/products/barsham-metallc-weave-rldw-20063"}
+{"id":"gid://shopify/UrlRedirect/71144669249","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114993","target":"/products/barsham-metallc-weave-rldw-20063"}
+{"id":"gid://shopify/UrlRedirect/71144702017","path":"/wallpaperstore/shantou-metallc-weave-p-114992.html","target":"/products/shantou-metallc-weave-rldw-20062"}
+{"id":"gid://shopify/UrlRedirect/71144734785","path":"/wallpaperstore/index.php?cpath=1604_6358_6350&main_page=product_info&products_id=114992","target":"/products/shantou-metallc-weave-rldw-20062"}
+{"id":"gid://shopify/UrlRedirect/71144767553","path":"/wallpaperstore/ionian-sea-linen-p-114991.html","target":"/products/ionian-sea-linen-rldw-20061"}
+{"id":"gid://shopify/UrlRedirect/71144800321","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114991","target":"/products/ionian-sea-linen-rldw-20061"}
+{"id":"gid://shopify/UrlRedirect/71144833089","path":"/wallpaperstore/marrakech-p-114990.html","target":"/products/marrakech-rldw-20060"}
+{"id":"gid://shopify/UrlRedirect/71144865857","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114990","target":"/products/marrakech-rldw-20060"}
+{"id":"gid://shopify/UrlRedirect/71144898625","path":"/wallpaperstore/travelers-tree-p-114989.html","target":"/products/travelers-tree-rldw-20059"}
+{"id":"gid://shopify/UrlRedirect/71144931393","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114989","target":"/products/travelers-tree-rldw-20059"}
+{"id":"gid://shopify/UrlRedirect/71144964161","path":"/wallpaperstore/travelers-tree-p-114988.html","target":"/products/travelers-tree-rldw-20058"}
+{"id":"gid://shopify/UrlRedirect/71144996929","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114988","target":"/products/travelers-tree-rldw-20058"}
+{"id":"gid://shopify/UrlRedirect/71145029697","path":"/wallpaperstore/travelers-tree-p-114987.html","target":"/products/travelers-tree-rldw-20057"}
+{"id":"gid://shopify/UrlRedirect/71145062465","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114987","target":"/products/travelers-tree-rldw-20057"}
+{"id":"gid://shopify/UrlRedirect/71145095233","path":"/wallpaperstore/travelers-tree-p-114986.html","target":"/products/travelers-tree-rldw-20056"}
+{"id":"gid://shopify/UrlRedirect/71145128001","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114986","target":"/products/travelers-tree-rldw-20056"}
+{"id":"gid://shopify/UrlRedirect/71145160769","path":"/wallpaperstore/kasbah-stripe-p-114985.html","target":"/products/kasbah-stripe-rldw-20055"}
+{"id":"gid://shopify/UrlRedirect/71145193537","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114985","target":"/products/kasbah-stripe-rldw-20055"}
+{"id":"gid://shopify/UrlRedirect/71145226305","path":"/wallpaperstore/marrakech-p-114984.html","target":"/products/marrakech-rldw-20054"}
+{"id":"gid://shopify/UrlRedirect/71145259073","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114984","target":"/products/marrakech-rldw-20054"}
+{"id":"gid://shopify/UrlRedirect/71145291841","path":"/wallpaperstore/kasbah-stripe-p-114983.html","target":"/products/kasbah-stripe-rldw-20053"}
+{"id":"gid://shopify/UrlRedirect/71145324609","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114983","target":"/products/kasbah-stripe-rldw-20053"}
+{"id":"gid://shopify/UrlRedirect/71145357377","path":"/wallpaperstore/tanzania-fl-p-114982.html","target":"/products/tanzania-fl-rldw-20052"}
+{"id":"gid://shopify/UrlRedirect/71145390145","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114982","target":"/products/tanzania-fl-rldw-20052"}
+{"id":"gid://shopify/UrlRedirect/71145422913","path":"/wallpaperstore/nairobi-leopard-p-114981.html","target":"/products/nairobi-leopard-rldw-20051"}
+{"id":"gid://shopify/UrlRedirect/71145455681","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114981","target":"/products/nairobi-leopard-rldw-20051"}
+{"id":"gid://shopify/UrlRedirect/71145488449","path":"/wallpaperstore/nairobi-leopard-p-114980.html","target":"/products/nairobi-leopard-rldw-20050"}
+{"id":"gid://shopify/UrlRedirect/71145521217","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114980","target":"/products/nairobi-leopard-rldw-20050"}
+{"id":"gid://shopify/UrlRedirect/71145553985","path":"/wallpaperstore/nairobi-leopard-p-114979.html","target":"/products/nairobi-leopard-rldw-20049"}
+{"id":"gid://shopify/UrlRedirect/71145586753","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114979","target":"/products/nairobi-leopard-rldw-20049"}
+{"id":"gid://shopify/UrlRedirect/71145619521","path":"/wallpaperstore/nairobi-leopard-p-114978.html","target":"/products/nairobi-leopard-rldw-20048"}
+{"id":"gid://shopify/UrlRedirect/71145652289","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114978","target":"/products/nairobi-leopard-rldw-20048"}
+{"id":"gid://shopify/UrlRedirect/71145685057","path":"/wallpaperstore/marrakech-p-114977.html","target":"/products/marrakech-rldw-20047"}
+{"id":"gid://shopify/UrlRedirect/71145717825","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114977","target":"/products/marrakech-rldw-20047"}
+{"id":"gid://shopify/UrlRedirect/71145750593","path":"/wallpaperstore/marrakech-p-114976.html","target":"/products/marrakech-rldw-20046"}
+{"id":"gid://shopify/UrlRedirect/71145783361","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114976","target":"/products/marrakech-rldw-20046"}
+{"id":"gid://shopify/UrlRedirect/71145816129","path":"/wallpaperstore/marrakech-p-114975.html","target":"/products/marrakech-rldw-20045"}
+{"id":"gid://shopify/UrlRedirect/71145848897","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114975","target":"/products/marrakech-rldw-20045"}
+{"id":"gid://shopify/UrlRedirect/71145881665","path":"/wallpaperstore/ninevah-weave-p-114974.html","target":"/products/ninevah-weave-rldw-20044"}
+{"id":"gid://shopify/UrlRedirect/71145914433","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114974","target":"/products/ninevah-weave-rldw-20044"}
+{"id":"gid://shopify/UrlRedirect/71145947201","path":"/wallpaperstore/tangiers-weave-p-114973.html","target":"/products/tangiers-weave-rldw-20043"}
+{"id":"gid://shopify/UrlRedirect/71145979969","path":"/wallpaperstore/index.php?cpath=1604_6358_6349&main_page=product_info&products_id=114973","target":"/products/tangiers-weave-rldw-20043"}
+{"id":"gid://shopify/UrlRedirect/71146012737","path":"/wallpaperstore/colony-club-floral-p-114972.html","target":"/products/colony-club-floral-rldw-20042"}
+{"id":"gid://shopify/UrlRedirect/71146045505","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114972","target":"/products/colony-club-floral-rldw-20042"}
+{"id":"gid://shopify/UrlRedirect/71146078273","path":"/wallpaperstore/dinner-at-eight-p-114971.html","target":"/products/dinner-at-eight-rldw-20041"}
+{"id":"gid://shopify/UrlRedirect/71146111041","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114971","target":"/products/dinner-at-eight-rldw-20041"}
+{"id":"gid://shopify/UrlRedirect/71146143809","path":"/wallpaperstore/coco-de-mer-p-114970.html","target":"/products/coco-de-mer-rldw-20040"}
+{"id":"gid://shopify/UrlRedirect/71146176577","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114970","target":"/products/coco-de-mer-rldw-20040"}
+{"id":"gid://shopify/UrlRedirect/71146274881","path":"/wallpaperstore/tycoon-silk-p-114968.html","target":"/products/tycoon-silk-rldw-20038"}
+{"id":"gid://shopify/UrlRedirect/71146307649","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114968","target":"/products/tycoon-silk-rldw-20038"}
+{"id":"gid://shopify/UrlRedirect/71146340417","path":"/wallpaperstore/sphistictd-lady-mtallc-p-114967.html","target":"/products/sphistictd-lady-mtallc-rldw-20037"}
+{"id":"gid://shopify/UrlRedirect/71146373185","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114967","target":"/products/sphistictd-lady-mtallc-rldw-20037"}
+{"id":"gid://shopify/UrlRedirect/71146405953","path":"/wallpaperstore/sphistictd-lady-mtallc-p-114966.html","target":"/products/sphistictd-lady-mtallc-rldw-20036"}
+{"id":"gid://shopify/UrlRedirect/71146438721","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114966","target":"/products/sphistictd-lady-mtallc-rldw-20036"}
+{"id":"gid://shopify/UrlRedirect/71146471489","path":"/wallpaperstore/auguste-sharkskin-p-114965.html","target":"/products/auguste-sharkskin-rldw-20035"}
+{"id":"gid://shopify/UrlRedirect/71146504257","path":"/wallpaperstore/index.php?cpath=1604_6358_6346&main_page=product_info&products_id=114965","target":"/products/auguste-sharkskin-rldw-20035"}
+{"id":"gid://shopify/UrlRedirect/71146537025","path":"/wallpaperstore/auguste-sharkskin-p-114964.html","target":"/products/auguste-sharkskin-rldw-20034"}
+{"id":"gid://shopify/UrlRedirect/71146569793","path":"/wallpaperstore/index.php?cpath=1604_6358_6346&main_page=product_info&products_id=114964","target":"/products/auguste-sharkskin-rldw-20034"}
+{"id":"gid://shopify/UrlRedirect/71146602561","path":"/wallpaperstore/melrose-metallic-p-114963.html","target":"/products/melrose-metallic-rldw-20033"}
+{"id":"gid://shopify/UrlRedirect/71146635329","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114963","target":"/products/melrose-metallic-rldw-20033"}
+{"id":"gid://shopify/UrlRedirect/71146668097","path":"/wallpaperstore/melrose-metallic-p-114962.html","target":"/products/melrose-metallic-rldw-20032"}
+{"id":"gid://shopify/UrlRedirect/71146700865","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114962","target":"/products/melrose-metallic-rldw-20032"}
+{"id":"gid://shopify/UrlRedirect/71146733633","path":"/wallpaperstore/melrose-metallic-p-114961.html","target":"/products/melrose-metallic-rldw-20031"}
+{"id":"gid://shopify/UrlRedirect/71146766401","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114961","target":"/products/melrose-metallic-rldw-20031"}
+{"id":"gid://shopify/UrlRedirect/71146930241","path":"/wallpaperstore/beale-gilded-weave-p-114958.html","target":"/products/beale-gilded-weave-rldw-20026"}
+{"id":"gid://shopify/UrlRedirect/71146963009","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114958","target":"/products/beale-gilded-weave-rldw-20026"}
+{"id":"gid://shopify/UrlRedirect/71146995777","path":"/wallpaperstore/beale-gilded-weave-p-114957.html","target":"/products/beale-gilded-weave-rldw-20025"}
+{"id":"gid://shopify/UrlRedirect/71147028545","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114957","target":"/products/beale-gilded-weave-rldw-20025"}
+{"id":"gid://shopify/UrlRedirect/71147061313","path":"/wallpaperstore/windsor-chalk-stripe-p-114956.html","target":"/products/windsor-chalk-stripe-rldw-20024"}
+{"id":"gid://shopify/UrlRedirect/71147094081","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114956","target":"/products/windsor-chalk-stripe-rldw-20024"}
+{"id":"gid://shopify/UrlRedirect/71147192385","path":"/wallpaperstore/odeon-blockprint-p-114954.html","target":"/products/odeon-blockprint-rldw-20022"}
+{"id":"gid://shopify/UrlRedirect/71147225153","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114954","target":"/products/odeon-blockprint-rldw-20022"}
+{"id":"gid://shopify/UrlRedirect/71147257921","path":"/wallpaperstore/carlyle-deco-p-114953.html","target":"/products/carlyle-deco-rldw-20021"}
+{"id":"gid://shopify/UrlRedirect/71147290689","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114953","target":"/products/carlyle-deco-rldw-20021"}
+{"id":"gid://shopify/UrlRedirect/71147323457","path":"/wallpaperstore/carlyle-deco-p-114952.html","target":"/products/carlyle-deco-rldw-20020"}
+{"id":"gid://shopify/UrlRedirect/71147356225","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114952","target":"/products/carlyle-deco-rldw-20020"}
+{"id":"gid://shopify/UrlRedirect/71147388993","path":"/wallpaperstore/carlyle-deco-p-114951.html","target":"/products/carlyle-deco-rldw-20019"}
+{"id":"gid://shopify/UrlRedirect/71147421761","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114951","target":"/products/carlyle-deco-rldw-20019"}
+{"id":"gid://shopify/UrlRedirect/71147454529","path":"/wallpaperstore/bartlett-zebra-p-114950.html","target":"/products/bartlett-zebra-rldw-20018"}
+{"id":"gid://shopify/UrlRedirect/71147487297","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114950","target":"/products/bartlett-zebra-rldw-20018"}
+{"id":"gid://shopify/UrlRedirect/71147520065","path":"/wallpaperstore/bartlett-zebra-p-114949.html","target":"/products/bartlett-zebra-rldw-20017"}
+{"id":"gid://shopify/UrlRedirect/71147552833","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114949","target":"/products/bartlett-zebra-rldw-20017"}
+{"id":"gid://shopify/UrlRedirect/71147585601","path":"/wallpaperstore/bartlett-zebra-p-114948.html","target":"/products/bartlett-zebra-rldw-20016"}
+{"id":"gid://shopify/UrlRedirect/71147618369","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114948","target":"/products/bartlett-zebra-rldw-20016"}
+{"id":"gid://shopify/UrlRedirect/71147651137","path":"/wallpaperstore/deco-bas-relief-p-114947.html","target":"/products/deco-bas-relief-rldw-20015"}
+{"id":"gid://shopify/UrlRedirect/71147683905","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114947","target":"/products/deco-bas-relief-rldw-20015"}
+{"id":"gid://shopify/UrlRedirect/71147716673","path":"/wallpaperstore/deco-bas-relief-p-114946.html","target":"/products/deco-bas-relief-rldw-20014"}
+{"id":"gid://shopify/UrlRedirect/71147749441","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114946","target":"/products/deco-bas-relief-rldw-20014"}
+{"id":"gid://shopify/UrlRedirect/71147782209","path":"/wallpaperstore/jazz-age-geometric-p-114945.html","target":"/products/jazz-age-geometric-rldw-20013"}
+{"id":"gid://shopify/UrlRedirect/71147814977","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114945","target":"/products/jazz-age-geometric-rldw-20013"}
+{"id":"gid://shopify/UrlRedirect/71147847745","path":"/wallpaperstore/jazz-age-geometric-p-114944.html","target":"/products/jazz-age-geometric-rldw-20012"}
+{"id":"gid://shopify/UrlRedirect/71147880513","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114944","target":"/products/jazz-age-geometric-rldw-20012"}
+{"id":"gid://shopify/UrlRedirect/71147913281","path":"/wallpaperstore/jazz-age-geometric-p-114943.html","target":"/products/jazz-age-geometric-rldw-20011"}
+{"id":"gid://shopify/UrlRedirect/71147946049","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114943","target":"/products/jazz-age-geometric-rldw-20011"}
+{"id":"gid://shopify/UrlRedirect/71147978817","path":"/wallpaperstore/swingtime-herringbone-p-114942.html","target":"/products/swingtime-herringbone-rldw-20010"}
+{"id":"gid://shopify/UrlRedirect/71148011585","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114942","target":"/products/swingtime-herringbone-rldw-20010"}
+{"id":"gid://shopify/UrlRedirect/71148044353","path":"/wallpaperstore/swingtime-herringbone-p-114941.html","target":"/products/swingtime-herringbone-rldw-20009"}
+{"id":"gid://shopify/UrlRedirect/71148077121","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114941","target":"/products/swingtime-herringbone-rldw-20009"}
+{"id":"gid://shopify/UrlRedirect/71148109889","path":"/wallpaperstore/swingtime-herringbone-p-114940.html","target":"/products/swingtime-herringbone-rldw-20008"}
+{"id":"gid://shopify/UrlRedirect/71148142657","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114940","target":"/products/swingtime-herringbone-rldw-20008"}
+{"id":"gid://shopify/UrlRedirect/71148240961","path":"/wallpaperstore/loasis-p-114938.html","target":"/products/l-oasis-rldw-20006"}
+{"id":"gid://shopify/UrlRedirect/71148273729","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114938","target":"/products/l-oasis-rldw-20006"}
+{"id":"gid://shopify/UrlRedirect/71148306497","path":"/wallpaperstore/loasis-p-114937.html","target":"/products/l-oasis-rldw-20005"}
+{"id":"gid://shopify/UrlRedirect/71148339265","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114937","target":"/products/l-oasis-rldw-20005"}
+{"id":"gid://shopify/UrlRedirect/71148372033","path":"/wallpaperstore/colony-club-floral-p-114936.html","target":"/products/colony-club-floral-rldw-20004"}
+{"id":"gid://shopify/UrlRedirect/71148404801","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114936","target":"/products/colony-club-floral-rldw-20004"}
+{"id":"gid://shopify/UrlRedirect/71148437569","path":"/wallpaperstore/colony-club-floral-p-114935.html","target":"/products/colony-club-floral-rldw-20003"}
+{"id":"gid://shopify/UrlRedirect/71148470337","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114935","target":"/products/colony-club-floral-rldw-20003"}
+{"id":"gid://shopify/UrlRedirect/71148503105","path":"/wallpaperstore/colony-club-floral-p-114934.html","target":"/products/colony-club-floral-rldw-20002"}
+{"id":"gid://shopify/UrlRedirect/71148535873","path":"/wallpaperstore/index.php?cpath=1604_6358_6356&main_page=product_info&products_id=114934","target":"/products/colony-club-floral-rldw-20002"}
+{"id":"gid://shopify/UrlRedirect/71148634177","path":"/wallpaperstore/fleur-moderne-p-114932.html","target":"/products/fleur-moderne-rldw-20000"}
+{"id":"gid://shopify/UrlRedirect/71148666945","path":"/wallpaperstore/index.php?cpath=1604_6358_6345&main_page=product_info&products_id=114932","target":"/products/fleur-moderne-rldw-20000"}
+{"id":"gid://shopify/UrlRedirect/71148699713","path":"/wallpaperstore/fleur-moderne-p-114931.html","target":"/products/fleur-moderne-rldw-19999"}
+{"id":"gid://shopify/UrlRedirect/71148732481","path":"/wallpaperstore/index.php?cpath=1604_6358_6345&main_page=product_info&products_id=114931","target":"/products/fleur-moderne-rldw-19999"}
+{"id":"gid://shopify/UrlRedirect/71148830785","path":"/wallpaperstore/brandt-geometric-p-114929.html","target":"/products/brandt-geometric-rldw-19997"}
+{"id":"gid://shopify/UrlRedirect/71148863553","path":"/wallpaperstore/index.php?cpath=1604_6358_6345&main_page=product_info&products_id=114929","target":"/products/brandt-geometric-rldw-19997"}
+{"id":"gid://shopify/UrlRedirect/71148896321","path":"/wallpaperstore/brandt-geometric-p-114928.html","target":"/products/brandt-geometric-rldw-19996"}
+{"id":"gid://shopify/UrlRedirect/71148929089","path":"/wallpaperstore/index.php?cpath=1604_6358_6345&main_page=product_info&products_id=114928","target":"/products/brandt-geometric-rldw-19996"}
+{"id":"gid://shopify/UrlRedirect/71148961857","path":"/wallpaperstore/brandt-geometric-p-114927.html","target":"/products/brandt-geometric-rldw-19995"}
+{"id":"gid://shopify/UrlRedirect/71148994625","path":"/wallpaperstore/index.php?cpath=1604_6358_6345&main_page=product_info&products_id=114927","target":"/products/brandt-geometric-rldw-19995"}
\ No newline at end of file
diff --git a/data/cand-empty.jsonl b/data/cand-empty.jsonl
new file mode 100644
index 0000000..a21d312
--- /dev/null
+++ b/data/cand-empty.jsonl
@@ -0,0 +1,200 @@
+{"id":"gid://shopify/UrlRedirect/73528737857","path":"/wallpaperstore/index.php?gclid=cj0kcqiatbnjbrdbarisao3zdl8n90wuru9vzvrzu8h_cbg8e4kqqdfxgevzb-hdtc1fhymmsn-74a4aap9fealw_wcb&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/73528770625","path":"/wallpaperstore/index.php?gclid=eaiaiqobchminr7e4fg_4aivcop3ch3g1qxreaeyasaaegk1yfd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/73528803393","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmivnki3dek4aivurtych0mjgq_eaeyasaaegjzc_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691379265","path":"/search?q=154306","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691412033","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmixmxlvawb4qivcmjach1erwmteaeyasaaegiu9_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691444801","path":"/wallpaperstore/index.php?main_page=product_info&products_id=10638","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691477569","path":"/wallpaperstore/wallpaper-book-collections-summer-sensation-7-11-c-1604_770_1697/senor-skullingwell-flock-velvet-rose-pink-p-26212?number_of_uploads=0","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691510337","path":"/wallpaperstore/wallpaper-book-collections-black-white-classic-walls-c-1604_770_2442/black-and-white-paisley-wallcovering-p-24785?number_of_uploads","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691543105","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmigtk-7ymb4qivqzd3ch38pg2ceaeyasaaegkkupd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691575873","path":"/wallpaperstore/index.php?main_page=product_info&products_id=32615","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691608641","path":"/wallpaperstore/wallpaper-book-collections-bh-hotel-tropical-prints-c-1604_770_4/the-original-martinique-wallpaper-beverly-hills-wallpaper-p-1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691641409","path":"/wallpaperstore/index.php?main_page=product_info&products_id=105372","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691674177","path":"/wallpaperstore/index.php?main_page=product_info&products_id=1335","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691706945","path":"/wallpaperstore/index.php?main_page=product_info&products_id=1333","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691739713","path":"/wallpaperstore/index.php?main_page=product_info&products_id=1359","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691772481","path":"/wallpaperstore/index.php?main_page=product_info&products_id=30433","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691805249","path":"/wallpaperstore/index.php?cpath=1604_3381&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691838017","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmiood74eod4qivcd7ach2vkae7eaeyasaaeglkn_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691870785","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmioy-wz-od4qiva9fkch3bfa66eaeyasaaegivrvd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691903553","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmi1dpvltud4qivrwkzch0jfwtqeaeyasaaegj8y_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691936321","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmiuicx-dqd4qivsqltch0i3gd7eaeyasaaeglbafd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74691969089","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmi0ssjnnid4qivu6lpch2wtgz7eaeyasaaeglkpfd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692001857","path":"/wallpaperstore/index.php?cpath=1604_67_44&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692034625","path":"/wallpaperstore/index.php?main_page=product_info&products_id=1327","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692067393","path":"/wallpaperstore/index.php?main_page=product_info&products_id=29824","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692100161","path":"/wallpaperstore/index.php?cpath=1604_770_2582&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692132929","path":"/wallpaperstore/index.php?cpath=1604_770_2561&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692165697","path":"/wallpaperstore/index.php?gclid=cj0kcqia5npjbrddarisam9x1gicx9zxsx3rxuvuqwpr5cim3xnrbpoo4-yumxugwi2yuz_vh8phhz0aamvjealw_wcb&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692198465","path":"/wallpaperstore/index.php?cpath=1604_2743_2634&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692231233","path":"/wallpaperstore/index.php?main_page=product_info&products_id=31461","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692264001","path":"/wallpaperstore/index.php?main_page=product_info&products_id=5848","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692296769","path":"/products/darian-dado-paintable-embossed-walls-5-panel-set-paint-6702","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692329537","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmi5c64hlcg4qivteaach0yiaaueaayaiaaegliwpd_bwe&keyword=90210&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692395073","path":"/wallpaperstore/index.php?main_page=product_info&products_id=31552","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692427841","path":"/wallpaperstore/index.php?gclid=eaiaiqobchminyf9-agg4qivlbybch2uowl6eaeyasaaegizl_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692460609","path":"/wallpaperstore/index.php?gclid=cjwkcajwvblkbrbbeiwachbcksy4tt8b281j77w-ooujl50kixlrcfn9a7vyfqgmpyt69etrkt0r3bocsaaqavd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692493377","path":"/wallpaperstore/index.php?gclid=cjwkcajwvblkbrbbeiwachbckxrgcfwjlmrsuuaandv3z2q9qju19lcxq5_gpfrmsxcukw8emgteqhocammqavd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692526145","path":"/wallpaperstore/index.php?main_page=product_info&products_id=96735","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692558913","path":"/wallpaperstore/index.php?main_page=product_info&products_id=35923","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692591681","path":"/wallpaperstore/index.php?main_page=product_info&products_id=24556","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692624449","path":"/wallpaperstore/index.php?cpath=1604_1617&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692657217","path":"/wallpaperstore/index.php?main_page=product_info&products_id=29823","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692689985","path":"/wallpaperstore/index.php?main_page=product_info&products_id=107642","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692722753","path":"/wallpaperstore/index.php?main_page=product_info&products_id=8555","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692755521","path":"/wallpaperstore/index.php?main_page=product_info&products_id=7802","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692788289","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmiinrm__oi4qivknjech39zqbzeaeyasaaegikkfd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692821057","path":"/wallpaperstore/index.php?gclid=cjwkcajw4lfkbrbdeiwac2dsldghq0ivovzqycec3lu4ijvsoyzaaorbj12ghoxg1_izqw4kxzeclrocgo4qavd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692853825","path":"/wallpaperstore/index.php?gclid=cjwkcajw4lfkbrbdeiwac2dslf7gqsgy1l_ihmkywsian5dcs5u1c0jou919mca5jvzaxp-t2rnwshocpxiqavd_bwe&keyword=90210&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692886593","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmizznf0lug4qiv14loch0ffwhbeaeyasaaegjcgvd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692919361","path":"/wallpaperstore/index.php?gclid=cjwkcajw4lfkbrbdeiwac2dsldmrmb4jazhuxj9w05xbiekngp_n-aeyqmqirvsla_x4rrp1ztuz_bocc7iqavd_bwe&keyword=90210&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692952129","path":"/wallpaperstore/index.php?main_page=product_info&products_id=26025","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74692984897","path":"/wallpaperstore/index.php?main_page=product_info&products_id=34874","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693017665","path":"/wallpaperstore/wallcoverings-wallpapers-walls-specialty-wall-textures-styles-c-1604_1527","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693050433","path":"/wallpaperstore/index.php?main_page=product_info&products_id=33222","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693083201","path":"/wallpaperstore/index.php?main_page=product_info&products_id=52614","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693115969","path":"/wallpaperstore/index.php","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693148737","path":"/wallpaperstore/index.php?gclid=eaiaiqobchminq-f2b-j4qivsmxach3jxw4peaeyasaaeginl_d_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693181505","path":"/wallpaperstore/index.php?cpath=1604_770_2619&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693214273","path":"/wallpaperstore/index.php?main_page=product_info&products_id=31611","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693247041","path":"/wallpaperstore/index.php?main_page=product_info&products_id=31638","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693279809","path":"/wallpaperstore/index.php?cpath=1604_770_2629&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693312577","path":"/wallpaperstore/inactive-specialty-contact-paper-c-1333_1178/mirror-contact-paper-p-5848","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693345345","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmihotl7sgj4qiv_cmtbh1wpqxjeaeyasaaegjzwfd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693378113","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmitbytrlqj4qivcwuvcb226wkleaeyasaaegks8vd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693410881","path":"/wallpaperstore/index.php?cpath=220_1695_1693&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693443649","path":"/wallpaperstore/index.php?cpath=1604_770_2593&main_page=index","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693476417","path":"/wallpaperstore/index.php?main_page=product_info&products_id=23690","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693509185","path":"/wallpaperstore/index.php?main_page=product_info&products_id=1522","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693541953","path":"/wallpaperstore/index.php?gclid=cjwkcajw4lfkbrbdeiwac2dslbw1zwkzx_scnbshrnyql-h0y9h8tcbqvvbkydn7rpjs7z377gu6zboc5gwqavd_bwe&keyword=90210&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693574721","path":"/wallpaperstore/index.php?gclid=eaiaiqobchmitoijoqaj4qivhchpch1m_qlxeaeyasaaegl65pd_bwe&keyword=lounge&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/74693607489","path":"/wallpaperstore/index.php?gclid=cjwkcajw4lfkbrbdeiwac2dslc9svihsqxwl6qqqxfulvqb_vezq7nfhyyzi7a-qyajp1flca6fx5hocv5kqavd_bwe&keyword=90210&main_page=advanced_search_result&search_in_description=1","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324885970995","path":"/products/victorian-flocked-velvet-wallpaper-gold-on-aged-gold-flk-119","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324886134835","path":"/products/snake-ss341-snake-ss341","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324886167603","path":"/products/faux-leather-bamboo-upholstery-vinyl-caramel-bamboo-caramel","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324886233139","path":"/products/faux-leather-bamboo-upholstery-vinyl-mocha-bamboo-mocha","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324886298675","path":"/products/faux-leather-bamboo-upholstery-vinyl-natural-bamboo-natural","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324886331443","path":"/products/faux-leather-bamboo-upholstery-vinyl-tea-bamboo-tea","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324890984499","path":"/products/le-bamboo-faux-leather-bark-bfl-5128","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324891050035","path":"/products/le-bamboo-faux-leather-mochal-bfl-5130","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324891115571","path":"/products/le-bamboo-faux-leather-natural-bfl-5131","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324891148339","path":"/products/le-bamboo-faux-leather-tea-bfl-5132","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324893081651","path":"/products/gator-faux-faux-alligator-teakwood-gfl-5191","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899143731","path":"/products/trina-turk-s-trellis-fab-987230","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899209267","path":"/products/trina-turk-s-trellis-fab-987231","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899242035","path":"/products/trina-turk-s-trellis-fab-987232","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899307571","path":"/products/trina-turk-s-trellis-fab-987233","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899373107","path":"/products/trina-turk-s-trellis-fab-987234","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899405875","path":"/products/trina-turk-s-trellis-fab-987235","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899471411","path":"/products/sunshine-swirls-fab-987240","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899536947","path":"/products/sunshine-swirls-fab-987241","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899569715","path":"/products/sunshine-swirls-fab-987242","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899635251","path":"/products/sunshine-swirls-fab-987243","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899700787","path":"/products/zoolu-zebra-animal-print-fab-987260","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899733555","path":"/products/zoolu-zebra-animal-print-fab-987261","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899799091","path":"/products/zoolu-zebra-animal-print-fab-987262","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899864627","path":"/products/zoolu-zebra-animal-print-fab-987263","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899897395","path":"/products/zoolu-zebra-animal-print-fab-987264","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324899962931","path":"/products/100-acrylic-twill-fab-987270","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900028467","path":"/products/pool-arches-fab-987271","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900061235","path":"/products/pool-arches-fab-987272","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900126771","path":"/products/modern-peacock-tribal-ethnic-print-fab-987280","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900192307","path":"/products/modern-peacock-tribal-ethnic-print-fab-987281","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900257843","path":"/products/modern-peacock-tribal-ethnic-print-fab-987282","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900290611","path":"/products/sunglass-1960-s-print-fab-987290","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900356147","path":"/products/sunglass-1960-s-print-fab-987291","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900421683","path":"/products/sunglass-1960-s-print-fab-987292","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900454451","path":"/products/sunglass-1960-s-print-fab-987293","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900519987","path":"/products/santorini-swirl-pattern-print-fab-987300","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900585523","path":"/products/santorini-swirl-pattern-print-fab-987301","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900618291","path":"/products/santorini-swirl-pattern-print-fab-987302","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900651059","path":"/products/santorini-swirl-pattern-print-fab-987303","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900716595","path":"/products/fabulous-leaf-fronds-print-fab-987310","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900749363","path":"/products/fabulous-leaf-fronds-print-fab-987311","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900814899","path":"/products/fabulous-leaf-fronds-print-fab-987312","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900880435","path":"/products/jacobean-fantasy-print-fab-987320","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900913203","path":"/products/pisces-water-paradise-print-fab-987330","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324900978739","path":"/products/pisces-water-paradise-print-fab-987331","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901044275","path":"/products/pisces-water-paradise-print-fab-987332","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901077043","path":"/products/hawaiian-kalaheo-print-fab-987660","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901142579","path":"/products/hawaiian-kalaheo-print-fab-987661","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901208115","path":"/products/hawaiian-kalaheo-print-fab-987662","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901273651","path":"/products/digital-madness-jax-print-fab-987680","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901306419","path":"/products/digital-madness-jax-print-fab-987681","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901371955","path":"/products/digital-madness-jax-print-fab-987682","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901437491","path":"/products/carmel-coastline-wavy-water-print-fab-987690","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901470259","path":"/products/carmel-coastline-wavy-water-print-fab-987691","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901535795","path":"/products/carmel-coastline-wavy-water-print-fab-987692","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901601331","path":"/products/carmel-coastline-wavy-water-print-fab-987693","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901666867","path":"/products/loop-de-loop-knot-print-fab-987700","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901699635","path":"/products/loop-de-loop-knot-print-fab-987701","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901765171","path":"/products/loop-de-loop-knot-print-fab-987702","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901830707","path":"/products/digital-bark-print-fab-987710","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901863475","path":"/products/digital-bark-print-fab-987711","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901929011","path":"/products/digital-bark-print-fab-987712","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324901994547","path":"/products/digital-bark-print-fab-987713","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902027315","path":"/products/digital-bark-print-fab-987714","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902092851","path":"/products/louis-nui-damask-print-fab-987720","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902158387","path":"/products/louis-nui-damask-print-fab-987721","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902191155","path":"/products/louis-nui-damask-print-fab-987722","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902256691","path":"/products/louis-nui-damask-print-fab-987723","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902322227","path":"/products/perfect-french-country-print-fab-987730","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902354995","path":"/products/perfect-french-country-print-fab-987731","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902420531","path":"/products/perfect-french-country-print-fab-987732","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902453299","path":"/products/tangier-retro-jacobean-chevron-fab-987740","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902518835","path":"/products/tangier-retro-jacobean-chevron-fab-987741","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902584371","path":"/products/tangier-retro-jacobean-chevron-fab-987742","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324902617139","path":"/products/tangier-retro-jacobean-chevron-fab-987743","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903075891","path":"/products/lola-diamond-fabric-fab-210000","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903141427","path":"/products/lola-diamond-fabric-fab-210001","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903174195","path":"/products/lola-diamond-fabric-fab-210002","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903239731","path":"/products/lola-diamond-fabric-fab-210003","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903305267","path":"/products/chet-s-chevron-fab-210004","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903338035","path":"/products/chet-s-chevron-fab-210005","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903403571","path":"/products/chet-s-chevron-fab-210006","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903436339","path":"/products/sylvia-fab-210007","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903501875","path":"/products/rubosto-fab-210008","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903600179","path":"/products/rubosto-fab-210009","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903632947","path":"/products/rubosto-fab-210010","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903698483","path":"/products/rubosto-fab-210011","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903764019","path":"/products/sensuous-silk-velvet-fab-210012","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903829555","path":"/products/sensuous-silk-velvet-fab-210013","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903862323","path":"/products/sensuous-silk-velvet-fab-210014","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903927859","path":"/products/sensuous-silk-velvet-fab-210015","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324903993395","path":"/products/luxuro-silk-fab-210016","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904026163","path":"/products/luxuro-silk-fab-210017","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904091699","path":"/products/luxuro-silk-fab-210018","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904157235","path":"/products/luxuro-silk-fab-210019","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904190003","path":"/products/luxuro-silk-fab-210020","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904255539","path":"/products/luxuro-silk-fab-210021","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904321075","path":"/products/sin-city-stripe-fab-210022","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904353843","path":"/products/sin-city-stripe-fab-210023","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904419379","path":"/products/sin-city-stripe-fab-210024","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904484915","path":"/products/parisian-paisley-wool-fab-210025","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904550451","path":"/products/parisian-paisley-wool-fab-210026","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904583219","path":"/products/parisian-paisley-wool-fab-210027","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904648755","path":"/products/parisian-paisley-wool-fab-210028","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904714291","path":"/products/vivian-s-vine-leaves-fab-210029","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904747059","path":"/products/vivian-s-vine-leaves-fab-210030","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904812595","path":"/products/vivian-s-vine-leaves-fab-210031","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904878131","path":"/products/vivian-s-vine-leaves-fab-210032","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904910899","path":"/products/vivian-s-vine-leaves-fab-210033","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324904976435","path":"/products/electric-chevron-fab-210034","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905041971","path":"/products/electric-chevron-fab-210035","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905074739","path":"/products/electric-chevron-fab-210036","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905140275","path":"/products/ron-s-retro-woven-ikat-fab-210037","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905205811","path":"/products/ron-s-retro-woven-ikat-fab-210038","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905238579","path":"/products/ron-s-retro-woven-ikat-fab-210039","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905304115","path":"/products/ron-s-retro-woven-ikat-fab-210040","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324905369651","path":"/products/ron-s-retro-woven-ikat-fab-210041","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324906319923","path":"/products/classic-aged-velvet-fabric-deep-brown-velv-67317","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324906844211","path":"/products/classic-aged-velvet-fabric-velv-67326","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324907040819","path":"/products/classic-aged-velvet-fabric-orange-gold-velv-67330","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324907106355","path":"/products/classic-aged-velvet-fabric-velv-67331","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324907204659","path":"/products/classic-aged-velvet-fabric-velv-67336","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324907302963","path":"/products/classic-aged-velvet-fabric-velv-67340","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324907860019","path":"/products/classic-aged-velvet-fabric-velv-67352","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324908089395","path":"/products/pompador-palm-beach-palm-leaf-green-tropical-leaf-prs-85700","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324908122163","path":"/products/tree-in-the-forest-pearls-prs-85701","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324908187699","path":"/products/tree-in-the-forest-pearls-prs-85702","target":"/"}
+{"id":"gid://shopify/UrlRedirect/324908253235","path":"/products/tree-in-the-forest-pearls-prs-85703","target":"/"}
\ No newline at end of file
diff --git a/data/cand-self.jsonl b/data/cand-self.jsonl
new file mode 100644
index 0000000..e69de29
diff --git a/data/classify-summary.json b/data/classify-summary.json
new file mode 100644
index 0000000..a20ff5f
--- /dev/null
+++ b/data/classify-summary.json
@@ -0,0 +1,20 @@
+{
+ "total": 100000,
+ "target_kind": {
+ "products": 64730,
+ "collections": 2851,
+ "pages": 7,
+ "blogs": 9,
+ "other_internal": 3,
+ "external": 280,
+ "root_or_empty": 32120
+ },
+ "prune_candidates_no_apicall": {
+ "self_redirect": 0,
+ "empty_or_root_target": 32120,
+ "chain_source_intermediate": 3220
+ },
+ "duplicate_target_groups": 29014,
+ "redirects_sharing_a_target": 98193,
+ "note": "dead-target(/products gone) counted separately by prune-redirects.mjs"
+}
\ No newline at end of file
diff --git a/data/status-tally.json b/data/status-tally.json
new file mode 100644
index 0000000..430c7af
--- /dev/null
+++ b/data/status-tally.json
@@ -0,0 +1,11 @@
+{
+ "n": 400,
+ "ACTIVE": 0,
+ "ARCHIVED": 193,
+ "DRAFT": 0,
+ "DEAD": 207,
+ "examples": {
+ "DEAD": "/products/darian-dado-paintable-embossed-walls-5-panel-set-paint-6702",
+ "ARCHIVED": "/products/victorian-flocked-velvet-wallpaper-gold-on-aged-gold-flk-119"
+ }
+}
diff --git a/probe-source-liveness.mjs b/probe-source-liveness.mjs
new file mode 100644
index 0000000..1ff5170
--- /dev/null
+++ b/probe-source-liveness.mjs
@@ -0,0 +1,29 @@
+// READ-ONLY bounded probe: of the /products/<handle> -> "/" redirects, how many SOURCE
+// handles are DEAD (404, safe prune) vs LIVE (redirect hijacks a live product -> BUG).
+import { readFileSync } from 'node:fs';
+const txt=readFileSync(`${process.env.HOME}/Projects/secrets-manager/.env`,'utf8');
+const env={}; for(const l of txt.split('\n')){const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m) env[m[1]]=m[2].replace(/^["']|["']$/g,'');}
+const STORE=env.SHOPIFY_STORE_DOMAIN, TOKEN=env.SHOPIFY_FULL_ACCESS_TOKEN, API='2024-10';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v={}){for(let a=0;;a++){const res=await fetch(`https://${STORE}/admin/api/${API}/graphql.json`,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});const j=await res.json();if(j.errors){if(/THROTTLED/i.test(JSON.stringify(j.errors))&&a<8){await sleep(1500*(a+1));continue;}throw new Error(JSON.stringify(j.errors));}return j.data;}}
+const N=Number((process.argv.find(a=>a.startsWith('--n='))||'').split('=')[1]||300);
+const rows=readFileSync('data/redirects-dump.jsonl','utf8').trim().split('\n').map(JSON.parse);
+const norm=s=>(s||'').split('?')[0].split('#')[0];
+const prodToRoot=rows.filter(r=>{const t=norm(r.target);return (!t||t==='/')&&/^\/products\//.test(r.path);});
+const handles=[...new Set(prodToRoot.map(r=>r.path.replace(/^\/products\//,'').split('?')[0].split('#')[0]))];
+process.stderr.write(`/products->/ redirects: ${prodToRoot.length}, unique source handles: ${handles.length}. Probing first ${N}...\n`);
+let dead=0, live=0;
+for(let i=0;i<Math.min(N,handles.length);i++){
+ const h=handles[i];
+ const d=await gql(`query($h:String!){ productByHandle(handle:$h){ id status } }`,{h});
+ if(d.productByHandle) live++; else dead++;
+ if(i%50===49) process.stderr.write(` probed ${i+1}: dead=${dead} live=${live}\n`);
+}
+const probed=Math.min(N,handles.length);
+console.log(JSON.stringify({
+ products_to_root_redirects: prodToRoot.length,
+ unique_source_handles: handles.length,
+ probed, dead_source_404: dead, live_source_HIJACK: live,
+ dead_ratio:+(dead/probed).toFixed(3), live_ratio:+(live/probed).toFixed(3),
+ interpretation: 'dead_source=safe prune (URL 404s anyway); live_source=redirect HIDES a live product page behind homepage (bug, delete restores it)'
+},null,2));
diff --git a/pull-and-classify.mjs b/pull-and-classify.mjs
new file mode 100644
index 0000000..93ff3d1
--- /dev/null
+++ b/pull-and-classify.mjs
@@ -0,0 +1,79 @@
+// TK-10640 — READ-ONLY pull of ALL Shopify url redirects + structural classification.
+// Pulls every redirect once (paginated), dumps to data/redirects-dump.jsonl, then
+// classifies prune candidates that need NO per-product call:
+// self : path === target (useless self-redirect)
+// empty_target : target empty or "/" (sends to homepage — usually junk)
+// chain_source : target is itself the PATH of another redirect (redirect chain; Shopify
+// won't hop twice, so the intermediate is dead weight)
+// dup_target : >1 redirect whose path differs but all point at same target (informational)
+// Dead-target (/products/<handle> gone) is done separately by prune-redirects.mjs.
+// NO WRITES. Uses SHOPIFY_FULL_ACCESS_TOKEN (only token with content read scope).
+import { readFileSync, writeFileSync, appendFileSync } from 'node:fs';
+const txt = readFileSync(`${process.env.HOME}/Projects/secrets-manager/.env`,'utf8');
+const env={}; for (const l of txt.split('\n')){const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m) env[m[1]]=m[2].replace(/^["']|["']$/g,'');}
+const STORE=env.SHOPIFY_STORE_DOMAIN, TOKEN=env.SHOPIFY_FULL_ACCESS_TOKEN;
+const API='2024-10';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(query,variables={}){
+ for(let a=0;;a++){
+ const res=await fetch(`https://${STORE}/admin/api/${API}/graphql.json`,{method:'POST',
+ headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},
+ body:JSON.stringify({query,variables})});
+ const j=await res.json();
+ if(j.errors){ if(/THROTTLED/i.test(JSON.stringify(j.errors))&&a<8){await sleep(2000*(a+1));continue;} throw new Error(JSON.stringify(j.errors)); }
+ return j.data;
+ }
+}
+const DUMP=`${process.env.HOME}/Projects/tk10640-redirect-prune/data/redirects-dump.jsonl`;
+writeFileSync(DUMP,'');
+let cursor=null, n=0;
+const all=[];
+while(true){
+ const d=await gql(`query($c:String){ urlRedirects(first:250, after:$c){ pageInfo{ hasNextPage endCursor } nodes{ id path target } } }`,{c:cursor});
+ const buf=[];
+ for(const r of d.urlRedirects.nodes){ all.push(r); buf.push(JSON.stringify(r)); n++; }
+ appendFileSync(DUMP, buf.join('\n')+'\n');
+ if(n%5000===0) process.stderr.write(` pulled ${n}\n`);
+ if(!d.urlRedirects.pageInfo.hasNextPage) break;
+ cursor=d.urlRedirects.pageInfo.endCursor;
+}
+process.stderr.write(`pulled ${n} total\n`);
+// classify
+const pathSet=new Set(all.map(r=>r.path));
+const norm=s=>(s||'').split('?')[0].split('#')[0];
+const targetCount=new Map();
+for(const r of all){ const t=norm(r.target); targetCount.set(t,(targetCount.get(t)||0)+1); }
+const cat={self:[],empty_target:[],chain_source:[],};
+const targetKind={products:0,collections:0,pages:0,blogs:0,other_internal:0,external:0,root_or_empty:0};
+for(const r of all){
+ const t=norm(r.target);
+ if(!t||t==='/') { cat.empty_target.push(r); targetKind.root_or_empty++; continue; }
+ if(r.path===r.target){ cat.self.push(r); }
+ if(pathSet.has(t) && t!==r.path){ cat.chain_source.push(r); }
+ if(/^\/products\//.test(t)) targetKind.products++;
+ else if(/^\/collections\//.test(t)) targetKind.collections++;
+ else if(/^\/pages\//.test(t)) targetKind.pages++;
+ else if(/^\/blogs\//.test(t)) targetKind.blogs++;
+ else if(/^https?:\/\//.test(t)) targetKind.external++;
+ else if(/^\//.test(t)) targetKind.other_internal++;
+}
+const dupTargets=[...targetCount.entries()].filter(([,c])=>c>1);
+const dupRedirectCount=dupTargets.reduce((s,[,c])=>s+c,0);
+const summary={
+ total:n,
+ target_kind:targetKind,
+ prune_candidates_no_apicall:{
+ self_redirect:cat.self.length,
+ empty_or_root_target:cat.empty_target.length,
+ chain_source_intermediate:cat.chain_source.length,
+ },
+ duplicate_target_groups:dupTargets.length,
+ redirects_sharing_a_target:dupRedirectCount,
+ note:'dead-target(/products gone) counted separately by prune-redirects.mjs',
+};
+writeFileSync(`${process.env.HOME}/Projects/tk10640-redirect-prune/data/classify-summary.json`, JSON.stringify(summary,null,2));
+// sample dumps for the memo
+writeFileSync(`${process.env.HOME}/Projects/tk10640-redirect-prune/data/cand-self.jsonl`, cat.self.slice(0,200).map(r=>JSON.stringify(r)).join('\n'));
+writeFileSync(`${process.env.HOME}/Projects/tk10640-redirect-prune/data/cand-empty.jsonl`, cat.empty_target.slice(0,200).map(r=>JSON.stringify(r)).join('\n'));
+writeFileSync(`${process.env.HOME}/Projects/tk10640-redirect-prune/data/cand-chain.jsonl`, cat.chain_source.slice(0,200).map(r=>JSON.stringify(r)).join('\n'));
+console.log(JSON.stringify(summary,null,2));
diff --git a/status-probe.mjs b/status-probe.mjs
new file mode 100644
index 0000000..adacf3a
--- /dev/null
+++ b/status-probe.mjs
@@ -0,0 +1,18 @@
+import { readFileSync } from 'node:fs';
+const txt=readFileSync(`${process.env.HOME}/Projects/secrets-manager/.env`,'utf8');
+const env={}; for(const l of txt.split('\n')){const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m) env[m[1]]=m[2].replace(/^["']|["']$/g,'');}
+const STORE=env.SHOPIFY_STORE_DOMAIN, TOKEN=env.SHOPIFY_FULL_ACCESS_TOKEN, API='2024-10';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v={}){for(let a=0;a<10;a++){try{const res=await fetch(`https://${STORE}/admin/api/${API}/graphql.json`,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});const tx=await res.text();let j;try{j=JSON.parse(tx);}catch{await sleep(1500*(a+1));continue;}if(j.errors){if(/THROTTLED/i.test(JSON.stringify(j.errors))){await sleep(1500*(a+1));continue;}throw new Error(JSON.stringify(j.errors));}return j.data;}catch(e){if(a<9){await sleep(1500*(a+1));continue;}throw e;}}}
+const rows=readFileSync('data/redirects-dump.jsonl','utf8').trim().split('\n').map(JSON.parse);
+const norm=s=>(s||'').split('?')[0].split('#')[0];
+const p2r=rows.filter(r=>{const t=norm(r.target);return (!t||t==='/')&&/^\/products\//.test(r.path);});
+let A=0,AR=0,DR=0,DE=0; const ex={};
+const N=Number((process.argv.find(a=>a.startsWith('--n='))||'').split('=')[1]||400);
+for(let i=0;i<N&&i<p2r.length;i++){ const h=p2r[i].path.replace(/^\/products\//,'').split('?')[0];
+ const d=await gql(`query($h:String!){productByHandle(handle:$h){status}}`,{h});
+ const st=d.productByHandle?d.productByHandle.status:'DEAD';
+ if(st==='ACTIVE')A++;else if(st==='ARCHIVED')AR++;else if(st==='DRAFT')DR++;else DE++;
+ if(!ex[st]) ex[st]=p2r[i].path;
+}
+console.log(JSON.stringify({n:Math.min(N,p2r.length),ACTIVE:A,ARCHIVED:AR,DRAFT:DR,DEAD:DE,examples:ex},null,2));
(oldest)
·
back to Tk10640 Redirect Prune
·
TK-10640 Cody fixes: random n=1000 re-probe (still 0 ACTIVE, 521f8f2 →